如何使用 union/project/select 在 gremlin 中获得组合顶点结果?
How to get combined vertex results in gremlin using union/project/select?
下面是我的示例图
addV('user').property('userId','user2').as('u2').
addV('user').property('userId','user3').as('u3').
addV('group').property('groupId','group1').as('g1').
addV('group').property('groupId','group2').as('g2').
addV('group').property('groupId','group3').as('g3').
addV('folder').property('folderId','folder1').property('folderName','director').as('f1').
addV('folder').property('folderId','folder2').property('folderName','asstDirector').as('f2').
addV('folder').property('folderId','folder3').property('folderName','editor').as('f3').
addV('file').property('fileId','file1').property('fileName','scene1').
addE('in_folder').to('f3').
addE('in_folder').from('f2').to('f1').
addE('in_folder').from('f3').to('f2').
addE('member_of').from('u1').to('g1').
addE('member_of').from('u2').to('g2').
addE('member_of').from('u3').to('g3').
addE('member_of').from('g3').to('g1').
addE('has_permission').property('prm','view').from('g1').to('f1').
addE('has_permission').property('prm','view').from('g2').to('f2').
addE('has_permission').property('prm','view').from('g3').to('f3').
addE('has_permission').property('prm','view').from('u2').to('f1').iterate()
用例:获取用户 3 有权访问的文件夹和文件顶点作为结果
我能够获取用户有权访问的文件夹或文件,但无法合并它们。
下面是关闭但不完全符合预期结果集的查询。
g.V().has('user','userId','user3').emit().until(__.not(outE('member_of'))).repeat(out('member_of'))
.outE('has_permission').has('prm','view').inV().as('f').inE('in').outV().as('a').select('a','f')
结果
==>[a:v[6144475224],f:v[164175920]]
==>[a:v[5202170056],f:v[204857480]]
期望得到 3 个具有 Map 值的顶点,而不仅仅是节点 ID。
f:v[164175920]
a:v[6144475224]
a:v[5202170056]
有人可以检查并让我知道如何在这里使用 union 吗?
尝试了以下查询
g.V().has('user','userId','user3').emit().until(__.not(outE('member_of'))).repeat(out('member_of'))
.outE('has_permission').has('prm','view').inV().inE('in').outV().map(union(valueMap())
这仅提供文件信息,不提供文件夹值。
您在评论查询中答对了,只有少数拼写错误导致了错误:
g.V().has('user','userId','user3').emit().repeat(out('member_of'))
.outE('has_permission').has('prm','view').inV().dedup()
.union(identity(),__.repeat(__.in('in_folder')).emit()).dedup()
这可以通过在 repeat 之前移动 emit 并删除 union 来稍微优化一下:
g.V().has('user','userId','user3').emit().repeat(out('member_of'))
.outE('has_permission').has('prm','view').inV().dedup()
.emit().repeat(__.in('in_folder')).dedup()
请注意,我在 'in' 上使用 'in_folder' 来匹配您的示例数据。
下面是我的示例图
addV('user').property('userId','user2').as('u2').
addV('user').property('userId','user3').as('u3').
addV('group').property('groupId','group1').as('g1').
addV('group').property('groupId','group2').as('g2').
addV('group').property('groupId','group3').as('g3').
addV('folder').property('folderId','folder1').property('folderName','director').as('f1').
addV('folder').property('folderId','folder2').property('folderName','asstDirector').as('f2').
addV('folder').property('folderId','folder3').property('folderName','editor').as('f3').
addV('file').property('fileId','file1').property('fileName','scene1').
addE('in_folder').to('f3').
addE('in_folder').from('f2').to('f1').
addE('in_folder').from('f3').to('f2').
addE('member_of').from('u1').to('g1').
addE('member_of').from('u2').to('g2').
addE('member_of').from('u3').to('g3').
addE('member_of').from('g3').to('g1').
addE('has_permission').property('prm','view').from('g1').to('f1').
addE('has_permission').property('prm','view').from('g2').to('f2').
addE('has_permission').property('prm','view').from('g3').to('f3').
addE('has_permission').property('prm','view').from('u2').to('f1').iterate()
用例:获取用户 3 有权访问的文件夹和文件顶点作为结果 我能够获取用户有权访问的文件夹或文件,但无法合并它们。
下面是关闭但不完全符合预期结果集的查询。
g.V().has('user','userId','user3').emit().until(__.not(outE('member_of'))).repeat(out('member_of'))
.outE('has_permission').has('prm','view').inV().as('f').inE('in').outV().as('a').select('a','f')
结果
==>[a:v[6144475224],f:v[164175920]]
==>[a:v[5202170056],f:v[204857480]]
期望得到 3 个具有 Map 值的顶点,而不仅仅是节点 ID。
f:v[164175920]
a:v[6144475224]
a:v[5202170056]
有人可以检查并让我知道如何在这里使用 union 吗? 尝试了以下查询
g.V().has('user','userId','user3').emit().until(__.not(outE('member_of'))).repeat(out('member_of'))
.outE('has_permission').has('prm','view').inV().inE('in').outV().map(union(valueMap())
这仅提供文件信息,不提供文件夹值。
您在评论查询中答对了,只有少数拼写错误导致了错误:
g.V().has('user','userId','user3').emit().repeat(out('member_of'))
.outE('has_permission').has('prm','view').inV().dedup()
.union(identity(),__.repeat(__.in('in_folder')).emit()).dedup()
这可以通过在 repeat 之前移动 emit 并删除 union 来稍微优化一下:
g.V().has('user','userId','user3').emit().repeat(out('member_of'))
.outE('has_permission').has('prm','view').inV().dedup()
.emit().repeat(__.in('in_folder')).dedup()
请注意,我在 'in' 上使用 'in_folder' 来匹配您的示例数据。