我对 gremlin 还很陌生。对于一个项目,我正在使用有向无环图 (DAG)。 这是一个子图(名称已更改)。
有级别(图中从 0 到 3)。
我需要从 Level0 开始遍历。 Id:0 到 Level3,Id:7。 (此处以绿色显示)。
ID 无关紧要。边缘无关紧要。 “名称”属性很重要,形成了一个层次结构。
这里 Level3 节点的名称与 level1 相同,只是添加了后缀。
我正在使用 AWS Jupyter Notebook
到目前为止,我一直在关注 gremlin 查询。
%%gremlin
g.V().has('Level0', 'name', 'node0').out()
.as("level1").sideEffect(__.values('name').store('level1_list'))
.out().as("level2").store('level2_list')
// need to compare with 'level1_list' here
.out().and(__.has('name', TextP.startingWith( 'node' ))).store('level3-list')
.dedup()
.path()
level1_list = ['node1', 'node2', 'node3']
level3_list = ['node1-suffix2', 'node2-suffix2', 'node3-suffix2']
想要的 =
level3_list = ['node3-suffix2']
当我只比较
TextP.startingWith
处的单个字符串时,查询有效。但是我需要检查Level3遍历下的当前节点是否以level1_list
中的任何节点开头
我无法让它工作。.out().and(__.has('name', in('level1_list')).store('level3-list') 但反过来。
此外,根据我的研究,我无法在 gremlin 中轻松拆分字符串。否则我本可以尝试将 level3 的名称的部分字符串与
level1_list
中的部分字符串匹配
像。
(__.has(<partial node name split on '-'> in('level1_list'))
所以我想关键问题是如何将节点名称与查询中获取的另一个列表进行比较。 在 python 中我可以很容易地完成以下操作,
>>> level1_list = ['node1', 'node2', 'node3']
>>> [ item for item in level1_list if item in 'node1-suffix2']
任何帮助表示赞赏。
编辑1) 我更新了图表以反映正确的所需遍历路径。
根据建议,我已将标签/名称设为相同,并将级别 1 的顶点中的相应“名称”作为属性添加到级别 3 中的相应顶点。
例如 穿越levle1之后,我就有了一个集合
.as("level1").sideEffect(__.values('name').store('level1_list'))
level1_list = ['node1', 'node2', 'node3']
现在,在将 level1 的各个顶点的“名称”添加到 level3 的顶点属性之后,我将有以下示例模式。对于顶点:
node1-suffix1
{
"id" : "node1-suffix1"
"name" : "node1-suffix1"
"attributes" : {
"level1_node" : "node1",
..............
},
"from" : ... // not imp here
"to" : ... // not imp here
}
所以问题是我如何遍历 level3 而只过滤相应的顶点(这里是 node1-suffix2)
有点像
.out()
.and(__.has('attributes.level1_node', within('level1_list')))
.as('level3-list')
. < level4 traversal>
. < next level traversal>
本质上检查此级别的每个顶点的
attributes.level1_node
是否在集合中level1_list
查询应该只过滤 node1-suffix2 顶点。
level3-list = [ v[node1-suffix2 ]]