Graph Gremlin循环遍历不同方向的边

Graph Gremlin循环遍历不同方向的边,graph,neo4j,gremlin,titan,Graph,Neo4j,Gremlin,Titan,我有图表(见下图)。我从A开始使用gremlin,需要沿着“影响”和“相似”的边缘将所有树循环起来 所以我需要像这样的东西: g.v(A.id).out('impacts', 'similarTo').loop(1){it.loops < 4}{true} g.v(A.id).out('impacts','similato').loop(1){it.loops

我有图表(见下图)。我从A开始使用gremlin,需要沿着“影响”和“相似”的边缘将所有树循环起来

所以我需要像这样的东西:

g.v(A.id).out('impacts', 'similarTo').loop(1){it.loops < 4}{true}
g.v(A.id).out('impacts','similato').loop(1){it.loops<4}{true}
这个查询的问题是,关系“similarTo”有时可能是outedge,有时是inedge(见图),这取决于应用程序当前存储数据的方式。我不能简单地使用“两者”(g.v(A.id)。两者('impacts','similato')…)来检索边,因为另一方面,我只需要“impacts”关系的out边。也有可能,某些顶点缺少“相似”边(例如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').copySplit('impacts'),'u().both('similato')).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}
g.v(A.id).as('x').bothE.filter{((it.label='impacts'&it.direction='out')| | it.label='similato')}.bothV.loop('x'){it.loops<4}{true}

有什么建议吗?

我没有使用Gremlin的经验,但在Cypher中,您可以按如下方式操作:

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

此查询返回所有路径,其中包含类型为impact和similato的单向关系,深度为3。

因此,我最终意识到在gremlin中正确的方法应该是:

g.v(A.id).as('x').copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true}
g.v(A.id).as('x').copySplit('impacts'),'u().both('similato')).fairMerge.loop('x'){it.loops<4}{true}
但目前gremlin()中存在缺陷,copyspilt不能很好地与loop一起工作。无论如何,我必须在CopySpilt之前添加.uz(),以使其正常工作:

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