【发布时间】:2018-04-06 07:09:59
【问题描述】:
我用 Neo4j 构建了一个包含 4000 万个节点和 4000 万个关系的图表。 大多数情况下,我搜索不同的最短路径,并且查询速度非常快。现在,每个查询通常需要几毫秒。
为了速度,我在关系属性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)
在step1上:n1和n2的属性等于1,relation的属性等于2,没关系,继续往下看
在第2步:n2的属性等于1,但n3的属性等于3,所以我们停止。如果是 1,我们无论如何都会停下来,因为关系 r2 不是 2,而是 5。
我使用过 RELATIONSHIPS 和 NODES 谓词,但它们似乎是分开工作的。
另外,我想这可以通过遍历 API 来完成,但是我必须重写很多其他代码,所以这是不可取的。
我错过了一些快速的解决方案吗?
【问题讨论】: