创建图书《图数据库》 第2版 p98(页)的Talent.net 数据库模型:
create class User Extends V
create class Company Extends V
create class Project Extends V
create class Topic Extends V
create class WORKS_FOR Extends E
create class WORKED_ON Extends E
create class INTERESTEN_IN Extends E
create vertex User set name='Ben'
create vertex User set name='Charlie'
create vertex User set name='Sarah'
create vertex User set name='Arnold'
create vertex User set name='Emily'
create vertex User set name='Gordon'
create vertex User set name='Kate'
create vertex Company set name='Acme,Inc.'
create vertex Company set name='Startup,Ltd.'
create vertex Topic set name='Medicine'
create vertex Topic set name='Cars'
create vertex Topic set name='REST'
create vertex Topic set name='Graphs'
create vertex Topic set name='Java'
create vertex Topic set name='Travel'
create vertex Topic set name='Design'
create vertex Topic set name='Art'
create vertex Topic set name='Music'
create vertex Topic set name='Drama'
create vertex Project set name='Next Gen Platform'
create vertex Project set name='Quantum Leap'
create vertex Project set name='Phoenix'
创建边的举例:
CREATE EDGE INTERESTEN_IN from #38:1 to #50:1
边需要单独创建。效果类似下面
orientdb {db=djhtest}> select * from #41:0
+----+-----+------+-------------------+-------------+-----+-------------+
|# |@RID |@CLASS|out_INTERESTEN_IN |out_WORKED_ON|name |out_WORKS_FOR|
+----+-----+------+-------------------+-------------+-----+-------------+
|0 |#41:0|User |[#65:2,#64:3,#65:3]|[#66:1,#66:2]|Sarah|[#54:1] |
+----+-----+------+-------------------+-------------+-----+-------------+
select from Topic
+----+-----+------+--------+-------------------------------+
|# |@RID |@CLASS|name |in_INTERESTEN_IN |
+----+-----+------+--------+-------------------------------+
|0 |#50:0|Topic |Medicine|[#64:0] |
|1 |#50:1|Topic |REST |[#64:2,#65:2,#64:4] |
|2 |#50:2|Topic |Java |[#65:3,#64:5] |
|3 |#50:3|Topic |Design |[#64:6] |
|4 |#50:4|Topic |Music |[#64:7,#64:8] |
|5 |#50:6|Topic |Art |[#65:6] |
|6 |#51:0|Topic |Cars |[#65:0] |
|7 |#51:1|Topic |Graphs |[#64:1,#65:1,#64:3,#65:4,#65:7]|
|8 |#51:2|Topic |Travel |[#65:5] |
|9 |#51:4|Topic |Drama |[#65:8] |
+----+-----+------+--------+-------------------------------+
select out("INTERESTEN_IN") from #41:0
+----+--------------------+
|# |out("INTERESTEN_IN")|
+----+--------------------+
|0 |[#50:1,#51:1,#50:2] |
+----+--------------------+
select out("INTERESTEN_IN").name from #41:0
+----+-------------------------+
|# |out("INTERESTEN_IN").name|
+----+-------------------------+
|0 |[REST,Graphs,Java] |
+----+-------------------------+
#41:0 Sarah 的感兴趣领域Topic的信息:
select * from Topic where name in ( select out("INTERESTEN_IN").name from #41:0)
+----+-----+------+------+-------------------------------+
|# |@RID |@CLASS|name |in_INTERESTEN_IN |
+----+-----+------+------+-------------------------------+
|0 |#50:1|Topic |REST |[#64:2,#65:2,#64:4] |
|1 |#50:2|Topic |Java |[#65:3,#64:5] |
|2 |#51:1|Topic |Graphs|[#64:1,#65:1,#64:3,#65:4,#65:7]|
+----+-----+------+------+-------------------------------+
和Sarah有相同兴趣的人的名字:
select in(INTERESTEN_IN).name from Topic where name in ( select out("INTERESTEN_IN").name from #41:0)
+----+---------------------------------+
|# |in(INTERESTEN_IN).name |
+----+---------------------------------+
|0 |[Ben,Sarah,Arnold] |
|1 |[Sarah,Arnold] |
|2 |[Charlie,Ben,Sarah,Arnold,Gordon]|
+----+---------------------------------+
或者这样查询
match {class:User,as:user,where:(name='Sarah')}.both('INTERESTEN_IN').both('INTERESTEN_IN'){as: name} RETURN user,name
+----+-----+-----+
|# |user |name |
+----+-----+-----+
|0 |#41:0|#38:0|
|1 |#41:0|#41:0|
|2 |#41:0|#38:1|
|3 |#41:0|#38:3|
|4 |#41:0|#38:0|
|5 |#41:0|#41:0|
|6 |#41:0|#38:1|
|7 |#41:0|#38:2|
|8 |#41:0|#41:0|
|9 |#41:0|#38:1|
+----+-----+-----+
Sarah的所在公司
select out("WORKS_FOR").name from #41:0
+----+---------------------+
|# |out("WORKS_FOR").name|
+----+---------------------+
|0 |[Acme,Inc.] |
+----+---------------------+
Sarah的同事:
select in("WORKS_FOR").name from Company where name in (select out("WORKS_FOR").name from #41:0)
+----+--------------------+
|# |in("WORKS_FOR").name|
+----+--------------------+
|0 |[Charlie,Ben,Sarah] |
+----+--------------------+
找到Sarah 的同事中和他兴趣一样的人:
match {class:User,where:(name='Sarah')}.both('INTERESTEN_IN').both('INTERESTEN_IN'){as: id},{class:User,where:(name='Sarah')}.both('WORKS_FOR').both('WORKS_FOR'){as: id} RETURN id,id.name
+----+-----+-------+
|# |id |id.name|
+----+-----+-------+
|0 |#38:0|Ben |
|1 |#41:0|Sarah |
|2 |#38:3|Charlie|
|3 |#38:0|Ben |
|4 |#41:0|Sarah |
|5 |#41:0|Sarah |
+----+-----+-------+
找到兴趣一样的人,并打印对应兴趣
match {class:User,where:(name='Sarah')}.both('INTERESTEN_IN').both('INTERESTEN_IN'){as: id},{class:User,where:(name='Sarah')}.both('WORKS_FOR').both('WORKS_FOR'){as: id} RETURN distinct id.name as name , id.out("INTERESTEN_IN").name as interests
+----+-------+----------------------+
|# |name |interests |
+----+-------+----------------------+
|0 |Ben |[Graphs,REST] |
|1 |Sarah |[REST,Graphs,Java] |
|2 |Charlie|[Medicine,Cars,Graphs]|
+----+-------+----------------------+
查找有共同兴趣的人,并列出公司:
match {class:User,where:(name='Sarah')}.both('INTERESTEN_IN').both('INTERESTEN_IN'){as: id},{class:Company}<-WORKS_FOR- {as:id } RETURN distinct id.name as name , id.out("INTERESTEN_IN").name as interests,id.out("WORKS_FOR").name as company
+----+-------+-------------------------+--------------+
|# |name |interests |company |
+----+-------+-------------------------+--------------+
|0 |Charlie|[Medicine,Cars,Graphs] |[Acme,Inc.] |
|1 |Ben |[Graphs,REST] |[Acme,Inc.] |
|2 |Sarah |[REST,Graphs,Java] |[Acme,Inc.] |
|3 |Arnold |[REST,Graphs,Java,Travel]|[Startup,Ltd.]|
|4 |Gordon |[Music,Graphs] |[Startup,Ltd.]|
+----+-------+-------------------------+--------------+
查询在共同项目下工作过的人,不包括当前用户Sarah
match {class:User,as: users,where:(name='Sarah')}.both("WORKED_ON").both("WORKED_ON") {as: id,where:($matched.users != $currentMatch) } RETURN id.name
+----+-------+
|# |id.name|
+----+-------+
|0 |Charlie|
|1 |Ben |
|2 |Arnold |
|3 |Emily |
|4 |Kate |
+----+-------+
查询在共同项目下工作过的且有相同兴趣的人,不包括当前用户Sarah
match {class:User,as: users,where:(name='Sarah')}.both("WORKED_ON").both("WORKED_ON") {as: id,where:($matched.users != $currentMatch) },{class:User,as: users,where:(name='Sarah')}.both("INTERESTEN_IN").both("INTERESTEN_IN") {as: id,where:($matched.users != $currentMatch) } RETURN distinct id.name,id.out("INTERESTEN_IN").name as interests
+----+-------+-------------------------+
|# |id.name|interests |
+----+-------+-------------------------+
|0 |Charlie|[Medicine,Cars,Graphs] |
|1 |Ben |[Graphs,REST] |
|2 |Arnold |[REST,Graphs,Java,Travel]|
+----+-------+-------------------------+