结合Neo4j中的两个子句使得查询非常慢

时间:2017-05-11 10:00:12

标签: neo4j cypher

我是Neo4j的新手,可能做些蠢事,拜托,求助。

我有18个节点,每个节点有2个字符串属性(oid和name)。查询中不使用名称。

节点与一个 double 属性(val)有关系。

当我通过过滤 val 值搜索最短路径时,我得到的结果是毫秒。

MATCH path=shortestPath( (p:ids{oid:'1027700070518'})-[*0..200]-(t:ids{oid:'1027739134950'})) WHERE ALL (x IN RELATIONSHIPS(path) WHERE x.val > 50.0) return length(path) as len, path

当我通过过滤 oid 值搜索最短路径时,我也会得到以毫秒为单位的结果。

MATCH path=shortestPath( (p:ids{oid:'1027700070518'})-[*0..200]-(t:ids{oid:'1027739134950'})) WHERE NONE(n IN nodes(path) WHERE (n.oid = '1' or n.oid = '2' or n.oid = '3' or n.oid = '4' or n.oid='5' or n.oid = '6' )  ) return length(path) as len, path

但是将它们组合到一个查询会使它永远运行。

MATCH path=shortestPath( (p:ids{oid:'1027700070518'})-[*0..200]-(t:ids{oid:'1027739134950'})) WHERE ( NONE(n IN nodes(path) WHERE (n.oid = '1' or n.oid = '2' or n.oid = '3' or n.oid = '4' or n.oid='5' or n.oid = '6' )) and (ALL (x IN RELATIONSHIPS(path) WHERE x.val > 50.0))) return length(path) as len, path

我做错了吗?

EXPLAIN对我没有帮助,我已经制作了截图。 PROFILE也会永远运行。

screenshot

1 个答案:

答案 0 :(得分:0)

问题'是最短路径(() - [* 0..200] - ())。在图表中添加一个案例,其中3个跃点中存在有效路径并且它应该运行得相当快......但是在任何边缘上将最差可接受的情况设置为200跳。因此,假设每个节点(平均)只有3个边,并且最短路径不会在边缘上回溯,对于所有200个节点,它必须检查2个跳。假设您的数据足够大以至于所有这些跃点都未被访问,那么必须检查2 ^ 200个路径以验证不存在路径(或^< #_ of_allowed_hops>)。正如您所看到的,在最坏的情况下,它的增长非常快。您可以通过减少允许的边缘(通过强制方向/类型)或限制跳跃来限制此操作(如果您知道应该没有超过42的有效路径,请继续将上限设置为尽可能低)。

简而言之,当找不到解决方案时,必须检查所有可能性)(如果没有有效路径,请继续尝试您的"良好"查询)