【发布时间】:2017-09-11 09:12:34
【问题描述】:
我有相当大的数据集(2000 万个节点,2 亿条边),最简单的 shortestPath 查询在几毫秒内完成,一切都很好。
但是...我需要允许 shortestPath 具有 999 类型的零或一关系,并且它只能是从起始节点开始的第一个。
所以,我的查询变成了这样:
MATCH (one:Obj{oid:'startID'})-[r1*0..1]-(b:Obj)
WHERE all(rel in r1 where rel.val = 999)
WITH one, b
MATCH (two:Obj{oid:'endID'}), path=shortestPath((one) -[0..21]-(two))
WHERE ALL (x IN RELATIONSHIPS(path)
WHERE (x.val > -1 and x.val<101) or (x.val=999 or x.val=998)) return path
当路径很短(最多 2-4)时,它会以毫秒为单位运行,但对于像 5++ 这样的路径,它可能需要 5 或 20 秒。也许我编写了低效的查询?
此问题将在可用时获得奖励。
【问题讨论】:
-
当删除最后一个条件“WHERE ALL (x IN RELATIONSHIPS(path) WHERE (x.val > -1 and x.val
-
我们不知道您有哪些索引,而且您的查询看起来像是从您的域中重新制定的,这使得回答变得更加困难。您能否在实际查询中发布
EXPLAIN的结果,以便我们看到正在执行的计划? -
另外,为什么
b在这个查询中,它不在第二个匹配或RETURN中,看起来像浪费工作。此外,如果您有关系类型,则应该在这些路径上使用它们......它们不会根据 relType 进行区分,并且您正在寻找通过任何无向关系的非常长的路径。如果您指定 rel 的顺序和合适的类型(或类型集),它可能已经好很多了,但这取决于我们看不到的数据方面。 -
感谢您的帮助!起初我搜索了 b 和 2 之间的最短路径,但它显示了路径 one-b 的所有附录(在可视模式下)。更改为 1 和 2 之间的最短路径显示相同的路线,没有不必要的附录。但是很慢......正如建议的那样,关系[0] 是对第一个关系施加条件的正确方法。
标签: performance neo4j cypher