Gremlin:查找一个集合中与另一个集合有连接的所有节点

Gremlin:查找一个集合中与另一个集合有连接的所有节点,gremlin,gremlinpython,Gremlin,Gremlinpython,给定两个Gremlin查询q1和q2及其结果ri=qi.toSet(),我想查找r1中与r2中的节点有连接的所有节点-忽略边标签和方向 我目前的方法包括计算两个结果集之间的最短路径: q1.shortestPath().with_(ShortestPath.target, q2).toList() 但是,我发现Tinkerpop中的最短路径计算不适合用于此目的,因为如果r1中有节点,而r2中没有任何节点连接,则结果将为空 相反,我考虑了连接的组件,但是connectedComponents()

给定两个Gremlin查询
q1
q2
及其结果
ri=qi.toSet()
,我想查找
r1
中与
r2
中的节点有连接的所有节点-忽略边标签和方向

我目前的方法包括计算两个结果集之间的最短路径:

q1.shortestPath().with_(ShortestPath.target, q2).toList()
但是,我发现Tinkerpop中的最短路径计算不适合用于此目的,因为如果r1中有节点,而r2中没有任何节点连接,则结果将为空

相反,我考虑了连接的组件,但是
connectedComponents()
步骤将产生找到的所有连接组件,我必须对它们进行筛选,以找到满足上述要求的连接组件


您对我如何用gremlin python解决这个问题有什么建议吗?

下面是一种我认为您在gremlin python中需要的方法。这可能有效,也可能无效,这取决于图形的大小和形状。在我的测试图中,只有顶点1、2和3有到12或13的路径。这个例子并没有告诉你你是如何到达那里的,只是至少有一条路径存在(如果有的话)

如果只关心路由是否存在,还可以使用dedup()而不是simplePath()和limit()

g.V(ids).filter(__.repeat(__.out().dedup()).until(__.hasId(within(ids2)))).toList()

谢谢你的建议。因为我对两个方向都感兴趣,所以我将
out()
替换为
both()
。不幸的是,如果初始设置(例如,g.V(ids))大于3,我会得到一个超时。我的图由大约7000个节点和19000条边组成。你能说一些关于你的图的形状/模式吗?。我使用一个有4K个顶点和50K条边的图测试了这个查询,没有任何问题。我尝试了不同数量的源顶点和目标顶点。我还编辑了我的答案,以显示编写查询的另一种方式。如果您只想知道每个源顶点和一个目标顶点之间至少存在一条路由,则dedup()形式将更有效。我怀疑,该图由几个完全连接的组件组成,此图中的路径可能太多。
g.V(ids).filter(__.repeat(__.out().dedup()).until(__.hasId(within(ids2)))).toList()