Graph 使用Gremlin在图形中查找最短路径,避免给定的顶点列表?

Graph 使用Gremlin在图形中查找最短路径,避免给定的顶点列表?,graph,neo4j,traversal,gremlin,Graph,Neo4j,Traversal,Gremlin,我需要使用Gremlin查找两个节点(顶点)之间的最短路径,同时避免列出给定的顶点 我已经: v.bothE.bothV.loop(2){!it.object.equals(y)}.path>>1 为了得到我的最短路径 我尝试了一些类似于: v.bothE.bothV.filter{it.name!=“忽略”}.loop(3){!it.object.equals(y)}.path>>1 但它似乎不起作用 请帮忙 您的第二个解决方案看起来是正确的。然而,要清楚地知道你想要完成什么。如果x和y是要在

我需要使用Gremlin查找两个节点(顶点)之间的最短路径,同时避免列出给定的顶点

我已经:

v.bothE.bothV.loop(2){!it.object.equals(y)}.path>>1

为了得到我的最短路径

我尝试了一些类似于:

v.bothE.bothV.filter{it.name!=“忽略”}.loop(3){!it.object.equals(y)}.path>>1

但它似乎不起作用


请帮忙

您的第二个解决方案看起来是正确的。然而,要清楚地知道你想要完成什么。如果x和y是要在它们之间找到最短路径的顶点,并且在遍历过程中要忽略的顶点具有属性名称:“忽略”,则查询为:

x.both.filter{it.name!="ignored"}.loop(2){!it.object.equals(y)}.paths>>1
如果要过滤的“给定顶点列表”实际上是一个列表,则遍历描述如下:

list = [ ... ] // construct some list
x.both.except(list).loop(2){!it.object.equals(y)}.paths>>1
此外,为了安全起见,我倾向于使用范围过滤器,因为如果忘记>>1:,这将进入无限循环。)

此外,如果可能没有路径,则为了避免无限长的搜索,可以执行循环限制(例如,不超过4个步骤):

现在开始你的穿越。请注意,这里没有name:“ignored”属性,因此我将其改为说明沿途每首歌曲的演出次数。因此,歌曲的最短路径在音乐会上播放了10多次:

gremlin> x.both.filter{it.performances > 10}.loop(2){!it.object.equals(y)}.paths>>1
==>v[89]
==>v[26]
==>v[100]
如果使用Gremlin 1.2+,则可以使用路径闭包提供这些顶点的名称(例如),而不仅仅是原始顶点对象:

gremlin> x.both.filter{it.performances > 10}.loop(2){!it.object.equals(y)}.paths{it.name}>>1
==>DARK STAR
==>PROMISED LAND
==>BROWN EYED WOMEN
我希望这有帮助

祝你好运!
马尔科。

回答得很好,谢谢马尔科。非常彻底!只有一个问题,我相信你能为我回答。我无法使其与问题中所述的查询一起工作,但当我将其更改为:v.bothE.bothV.filter{it.getProperty('name')!='ignored'}.loop(3){!it.object.equals(y)}.path>>1时,它工作了,即使用它.getProperty。这是为什么呢?这是因为循环中的管道是先计算宽度的(请参见)。如果不是这种情况,那么如果从x到y有一个通过顶点a的三步路径,但有一个通过顶点b的两步路径,并且从两个管道返回的第一个顶点是顶点a,那么此管道将返回三步路径,而不是最短的路径。您可以使用neo4j图算法:。当然,你需要在小精灵之外做这件事。如果我在嵌入式模式下使用neo4j,我个人会将gremlin与直接调用neo4j结合起来。
gremlin> g = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> g.loadGraphML('data/graph-example-2.xml')
==>null
gremlin> x = g.v(89) 
==>v[89]
gremlin> y = g.v(100) 
==>v[100]
gremlin> x.name
==>DARK STAR
gremlin> y.name
==>BROWN EYED WOMEN
gremlin> x.both.filter{it.performances > 10}.loop(2){!it.object.equals(y)}.paths>>1
==>v[89]
==>v[26]
==>v[100]
gremlin> x.both.filter{it.performances > 10}.loop(2){!it.object.equals(y)}.paths{it.name}>>1
==>DARK STAR
==>PROMISED LAND
==>BROWN EYED WOMEN