基于Gremlin的图书俱乐部权限与版本查询技术求助
关于图书俱乐部图数据库的Gremlin查询问题
背景
存在一个涵盖不同主题图书的图书俱乐部,俱乐部追踪图书修订版本,但仅保留最新版。学生可通过个人权限或所属组权限访问图书最新版。
顶点
- BOOKCLUB
- BOOK
- STUDENT
- GROUP
边
- BOOKCLUB
hasBookBOOK(俱乐部拥有图书) - BOOK
nextRevisionBOOK(图书修订版本关联) - STUDENT
belongsToGROUP(学生属于组) - BOOK
hasUserAccessSTUDENT(图书允许特定学生直接访问) - BOOK
hasGroupAccessGROUP(图书允许特定组访问)
测试数据Gremlin代码
// Book Club g.addV('BOOKCLUB').property('name', 'The Bookworms').as('bc'). // Book 1 with 2 revisions addV('BOOK').property('name', 'Engineering Book').as('b1'). addV('BOOK').property('name', 'Engineering Book v2').as('b1_v2'). addV('BOOK').property('name', 'Engineering Book v3').as('b1_v3'). // Book 2 with 1 revision addV('BOOK').property('name', 'Medical Book').as('b2'). addV('BOOK').property('name', 'Medical Book v2').as('b2_v2'). // Book 3 with 3 revisions addV('BOOK').property('name', 'Self Help Book').as('b3'). addV('BOOK').property('name', 'Self Help Book v2').as('b3_v2'). addV('BOOK').property('name', 'Self Help Book v3').as('b3_v3'). addV('BOOK').property('name', 'Self Help Book v4').as('b3_v4'). // Six students addV('STUDENT').property('name', 'student1').as('s1'). addV('STUDENT').property('name', 'student2').as('s2'). addV('STUDENT').property('name', 'student3').as('s3'). addV('STUDENT').property('name', 'student4').as('s4'). addV('STUDENT').property('name', 'student5').as('s5'). addV('STUDENT').property('name', 'student6').as('s6'). // Two groups addV('GROUP').property('name', 'Engineering Group').as('g1'). addV('GROUP').property('name', 'Medical Group').as('g2'). // Book club has those three books addE('hasBook').from('bc').to('b1'). addE('hasBook').from('bc').to('b2'). addE('hasBook').from('bc').to('b3'). // Book 1 has relationship to its revisions addE('nextRevision').from('b1').to('b1_v2'). addE('nextRevision').from('b1_v2').to('b1_v3'). // Book 2 has relationship to its revisions addE('nextRevision').from('b2').to('b2_v2'). // Book 3 has relationship to its revisions addE('nextRevision').from('b3').to('b3_v2'). addE('nextRevision').from('b3_v2').to('b3_v3'). addE('nextRevision').from('b3_v3').to('b3_v4'). // Some students belong to groups addE('belongsTo').from('s1').to('g1'). addE('belongsTo').from('s2').to('g1'). addE('belongsTo').from('s3').to('g2'). addE('belongsTo').from('s4').to('g2'). // Some students have direct access to latest revision of books addE('hasUserAccess').from('b1_v3').to('s1'). addE('hasUserAccess').from('b2_v2').to('s5'). addE('hasUserAccess').from('b2_v2').to('s6'). // Some students have access to latest revision of books via groups addE('hasGroupAccess').from('b1_v3').to('g1'). addE('hasGroupAccess').from('b1_v3').to('g2')
说明
- 无
hasUserAccess/hasGroupAccess边的图书(如Book 3)视为公开图书,所有学生均可访问。
查询需求
1. 给定图书俱乐部ID,查询某学生可访问的图书最新版
各学生预期结果:
- Student1(直接+组权限):
['Self Help Book v4', 'Engineering Book v3'] - Student2(组权限):
['Self Help Book v4', 'Engineering Book v3'] - Student3(组权限):
['Self Help Book v4', 'Engineering Book v3'] - Student4(组权限):
['Self Help Book v4', 'Engineering Book v3'] - Student5(直接权限):
['Self Help Book v4', 'Medical Book v2'] - Student6(直接权限):
['Self Help Book v4', 'Medical Book v2']
2. 给定图书俱乐部ID,查询其拥有的所有图书最新版
预期结果:['Self Help Book v4', 'Engineering Book v3', 'Medical Book v2']
已尝试的部分查询
(1) 获取单本图书的最新版本
g.V('10478'). repeat(out('nextRevision')). until(__.not(out('nextRevision'))). local(fold().limit(1))
返回结果为10487(对应'Self Help Book v4'的ID)。
(2) 获取图书俱乐部所属图书
g.V('10460').out('hasBook')
返回结果为图书初始版本(非最新版):['Self Help Book', 'Engineering Book', 'Medical Book']
求助
目前无法将上述部分查询整合为满足需求的完整查询,需要帮助写出符合要求的Gremlin查询语句。
内容的提问来源于stack exchange,提问作者Gurpreet Singh
相关产品推荐
相关产品推荐

