【问题标题】:Find shortest path with complex predicate (check simultaneously both node properties and relation property)使用复杂谓词查找最短路径(同时检查节点属性和关系属性)
【发布时间】: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 来完成,但是我必须重写很多其他代码,所以这是不可取的。

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    看起来您的基本查询运行得相当快。如果您想在其他步骤进行过滤,您可能必须添加额外的可选 match 和 with 语句以适应过滤器。不需要的元素应该退出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多