图数据库:Talent.net 社交数据库例子和相关练习

创建图书《图数据库》 第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]|

+----+-------+-------------------------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值