0

我有图表(见下图)。我使用 A 中的 gremlin,需要在边缘“影响”和“相似”之后循环所有树。

所以我需要类似的东西:

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

这个查询的问题是,关系“similarTo”有时可能在边缘,有时在边缘(见图),这取决于应用程序目前如何存储数据。我不能简单地使用 "both" (gv(A.id).both('impacts', 'similarTo')...) 来检索边缘,因为另一方面我只需要 out edge 来实现“影响”关系。也有可能,某些顶点(例如 C)缺少“similarTo”边,在这种情况下,循环应该只遵循“影响”关系。

图形

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

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}

有什么建议么?

4

2 回答 2

1

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

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

但是目前 gremlin 中存在错误(请参阅错误报告),并且 copySplit 不适用于循环。无论如何,我必须在 copySplit 之前添加 ._() 才能使其正常工作:

g.v(A.id).as('x')._().copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true}
于 2013-05-13T15:02:35.687 回答
0

我没有使用 Gremlin 的经验,但是在 Cypher 中你可以这样做:

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

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

于 2013-05-13T14:36:50.530 回答