查找具有复杂谓词的最短路径(同时检查节点属性和关系属性)

时间:2018-04-06 07:09:59

标签: neo4j cypher

我已经建立了一个包含40万个节点和与Neo4j的40万个关系的图表。 大多数情况下,我搜索不同的最短路径,查询速度非常快。现在,每个查询通常需要几毫秒。

对于速度,我对关系属性 val 中的所有参数进行编码,因此普通查询如下所示:

MATCH (one:Obj{oid:'1'})
with one
MATCH (two:Obj{oid:'2'}), path=shortestPath((one) -[*0..50]-(two))
WHERE ALL (x IN RELATIONSHIPS(path) WHERE ((x.val > 50 and x.val<109)  ))
return path

但是一个过滤器不能这样做,因为它应该评估(在每个步骤)起始节点的属性,关系的属性,结束节点的属性,例如:

Path: n1(==1)-r1(==2)-n2(==1)-r2(==5)-n3(==3)

在第1步:n1和n2的属性等于1,关系的属性等于2,这样就行了,进一步

在步骤2:n2的属性等于1,但是n3的属性等于3,所以我们停止。如果它是1,我们无论如何都会停止,因为关系r2不是2,而是5。

我使用了RELATIONSHIPS和NODES谓词,但它们似乎分开工作。

另外,我想这可以通过遍历API来完成,但是我必须重写我的很多其他代码,所以这是不可取的。

我错过了一些快速解决方案吗?

1 个答案:

答案 0 :(得分:0)

看起来您的基本查询运行得非常快。如果要在其他步骤中进行过滤,则可能必须添加其他可选匹配项和语句以适应过滤器。不受欢迎的元素应该退出。