当前位置: 首页 > 知识库问答 >
问题:

Gremlin循环遍历各种边缘方向

锺英卫
2023-03-14

我有图表(见下图)。我使用A中的gremlin,需要沿着边缘“impacts”和“Similato”循环所有树。

所以我需要这样的东西:

g.v(A.id).out('impacts', 'similarTo').loop(1){it.loops < 4}{true}

此查询的问题是,关系“相似”有时可能是边缘外,有时可能是边缘内(见图),这取决于应用程序当前存储数据的方式。我不能简单地使用“两者”(g. v(A. id).都('影响','相似')...)来检索边,因为另一方面,我只需要“影响”关系的边缘。也有可能,某些顶点缺少“相似”边(例如C),在这种情况下,循环应该只遵循“影响”关系。

最后我尝试了这样的方法,但我认为我用错了,结果不合适:

g.v(A.id).as('x').copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true}

我还尝试在遍历过程中按方向过滤边缘,但这可能不受支持,因此这也不起作用:

g.v(A.id).as('x').bothE.filter{((it.label=='impacts' & it.direction=='out') || it.label=='similarTo')}.bothV.loop('x'){it.loops < 4}{true}

有什么建议吗?

共有2个答案

方树
2023-03-14

我没有使用小精灵的经验,但在Cypher中,您可以按以下方式进行操作:

START n=node({id})
MATCH p=n-[:impacts|similarTo*3]-m
RETURN p

此查询返回所有包含类型影响和相似的单向关系的路径,深度为3。

姚新霁
2023-03-14

所以最后我意识到在gremlin中正确的方法应该是:

g.v(A.id).as('x').copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true}

但目前gremlin中存在错误(请参阅错误报告),CopySpilt与loop不兼容。无论如何,我必须在CopySpilt之前添加._()以使其工作:

g.v(A.id).as('x')._().copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true}
 类似资料:
  • 我试图使用Gremlin从一个起始节点向外遍历到连接X度内的所有连接节点。连接的方向无关紧要,所以我使用了函数。我还希望能够防止遍历与特定标签相交。这是一个示例图。 到目前为止,我进行的遍历如下所示: 然而,这并不是我所寻找的。我想要一些实际上可以防止遍历者在必须跨越指定边缘时触及顶点的东西。我当前的实现过滤具有传入边缘的顶点,但在某些情况下,如果遍历者跨越不同的边缘到达那里,我可能仍然希望该顶点

  • 我有一个具有两个顶点的简单图,ID为“a”和“b”。 我已将标签为“foo”的边从“a”分配给“b” 小妖精 == == 小妖精 == 我的问题是:如何沿同一条边向后移动?例如,如果一个查询遍历到一个出站顶点,那么该查询如何穿越同一条边返回到入站顶点? 我的查询如下: g、 E('04b4b9fd-2f20-751d-5673-5aa9d7ce0285').outV()。作为('outV')…[要

  • 编辑:在@Prashant回答后,我明白我的输出顺序需要保留,因此我相应地编辑了我的原始问题并重新发布。 我想从根节点(2)遍历到叶节点(1、6、8、3、11和12)。在这种遍历过程中,我希望获取连接到产品节点13(即)的节点,我希望编写一个返回1、8、9、3、11和12的查询。 @Prashant的回答: 输出 然而,我所需输出的顺序是1、8、9、3、11和12,即在每个级别上,要求选择一个子节

  • 问题内容: 我有一个具有1 2 3 4 5值的数组。 现在我想以循环方式遍历它。像我想打印2 3 4 5 1或3 4 5 1 2或5 1 2 3 4等等。有什么 算法 吗? 编辑: 我想以循环方式打印所有组合。我不想在初始阶段说明起点。 问题答案: (如果要从向下迭代数组,请在数组下标表达式中更改为。) 我应该注意,就执行速度而言,这可能不是表达循环的最有效方法。但是,差异很小,并且 很可能无关紧

  • 我有一个顶点上插工作和一个边缘上插工作在2个单独的遍历中。是否可以将2合并为1遍历?我尝试过,但收到错误。 a=自身g.V()。has('account',id',account-111111111').fold().coalesce(.unfold(),.addV('account').property(T.id,'account-111111111'))。has('customer','id'