Gremlin循环遍历各种边缘方向

时间:2013-05-12 14:53:23

标签: graph neo4j gremlin titan

我有图表(见下图)。我和A的gremlin一起去,需要沿着“impact”和“similarTo”边缘将所有树循环起来。

所以我需要这样的东西:

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

这个查询的问题是,“similarTo”关系有时可能会出现边缘,有时会出现在边缘(见图),取决于应用程序此刻存储数据的方式。我不能简单地使用“both”(g.v(A.id).both('impact','similarTo')...)来检索边缘,因为另一方面我只需要“冲击”关系的边缘。也有可能,某些顶点(例如C)缺少'similarTo'边缘,在这种情况下,循环应仅遵循'影响'关系。

graph

最后我尝试了类似的东西,但我认为我错误地使用它并且结果不合适:

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 个答案:

答案 0 :(得分:1)

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

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

但目前gremlin中存在错误(see bug report)并且copySplit与循环不兼容。无论如何,我必须在copySplit之前添加._()才能使其正常工作:

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

答案 1 :(得分:0)

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

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

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