在Gremlin Graph遍历过程中收集属性和某些类型的OUT节点



我有一个简单的类型图:

(3) -> (2) -> (1)
 |     | |     |
(D)    |(B)   (A)
      (C)

在这种情况下,我想从(3(到(1(穿越。将其视为一棵树,其中节点(1(是根,节点(3(是叶子,边缘(3(到(2(和(2(和(2(至(1(表示父母关系(2是3的父,等(。

同时,代表树节点(1、2、3(的每个顶点具有一个或多个表示权限关系的边缘,因此在这种情况下,(a(代表用户以及(1(与(1(之间的关系(a(表示用户(a(超过(1(的权限(访问(。对于(2(,有两个用户可以访问此顶点(B和C(。

您可以想象带有数字的节点是"文件夹",并且具有某些属性(即名称(和带字母的节点是用户或权限,并且也具有某些属性(即名称,访问类型等(。

(。

i可以成功地将图形从3到1,路径中每个节点的打印属性(请参见下面的示例(。

所以例如,如果我这样做:

gremlin> g.V('3').repeat(out()).until(has(id, '1')).path().by('name')
==>[folder1.1, folder1, root]

gremlin> g.V('3').repeat(out()).until(has(id, '1')).path().by('name')
==>[folder1.1, folder1, root]
gremlin> g.V('3').repeat(out('parent').simplePath().store('x')).until(has(id, '1')).cap('x')
==>{v[2]=1, v[1]=1}
// Although at this point I missed listing v[3]

问题是我需要穿越树并以方式收集权限,例如(和格式可能会有所不同(,我正在寻找一种在以下方式中获得某些东西的方法。

gremlin> ...
==>[ { { 3, name="foo" } , [ { D, permission="x" } ] }, { 2, [ {A, permission="y" }, {B, permission="z"} ] }, { { 3, name="foo" } , [ { D, permission="x" } ] } ]

基本上,我想穿越路径从(3(到(1((可能不仅有三个节点(,在路径中收集顶点的属性,并收集与某些外边缘相关的顶点(只有一个级别(仅一个级别(,我不想超越单个优势以获得权限(及其属性。

请注意,我是Gremlin的新手,我在此过程中一直在尝试和学习几天,甚至不知道是否可能...

任何想法,建议将不胜感激,谢谢!

执行此操作时:

gremlin> g.V('3').repeat(out()).until(has(id, '1')).path().by('name')
==>[folder1.1, folder1, root]

认识到by()调节器至path()只是一个转换。调制器以圆形旋转方式应用于路径中的每个项目(因为您只提供了一个by()(。该转换说:"将图形元素(即 Vertex(在路径中获取,然后提取'name'属性值并返回该属性,而不是实际的顶点。"

鉴于知识实际上只需要一种不同形式的转换即可从路径中获取所需的数据。请注意,by()的过载将Traversal作为参数,这意味着您可以将Traversal应用于路径中的每个图元素。我认为project()将是生产所需输出的好步骤 - 类似:

g.V('3').repeat(out()).until(has(id, '1')).
  path().
    by(project('name','permissions').
         by('name').
         by(out('permissions').fold()))

请注意,上面的说法是:"对于路径中的每个顶点,将其投影到Map,并用键'名称'和" permissions"将"名称"是从路径中的顶点开始的"名称"值权限是相关权限顶点的列表。">

最新更新