3

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

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

q1.shortestPath().with_(ShortestPath.target, q2).toList()

但是,我发现 Tinkerpop 中的最短路径计算不适用于此目的,因为如果 r1 中有节点而与 r2 中的任何节点没有任何连接,则结果将为空。

相反,我考虑了连接组件,但该connectedComponents()步骤将产生找到的所有连接组件,我必须过滤它们以找到满足上述要求的连接组件。

你对我如何在 gremlin-python 中解决这个问题有什么建议吗?

4

1 回答 1

2

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

>>> ids = g.V('1','2','3','99999').id().toList()
>>> ids
['1', '2', '3', '99999']
>>> ids2 = g.V('12','13').id().toList()
>>> ids2
['12', '13']

>>> g.V(ids).filter(__.repeat(__.out().simplePath()).until(__.hasId(within(ids2))).limit(1)).toList()
[v[1], v[2], v[3]]

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

g.V(ids).filter(__.repeat(__.out().dedup()).until(__.hasId(within(ids2)))).toList()
于 2019-12-27T15:13:16.750 回答