You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Gremlin的图书俱乐部权限与版本查询技术求助

关于图书俱乐部图数据库的Gremlin查询问题

背景

存在一个涵盖不同主题图书的图书俱乐部,俱乐部追踪图书修订版本,但仅保留最新版。学生可通过个人权限或所属组权限访问图书最新版。

顶点

  • BOOKCLUB
  • BOOK
  • STUDENT
  • GROUP

边

  • BOOKCLUB hasBook BOOK(俱乐部拥有图书)
  • BOOK nextRevision BOOK(图书修订版本关联)
  • STUDENT belongsTo GROUP(学生属于组)
  • BOOK hasUserAccess STUDENT(图书允许特定学生直接访问)
  • BOOK hasGroupAccess GROUP(图书允许特定组访问)

测试数据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:15:53