Neo4j 具有无限关系的密码查询将花费永远的时间
我正在尝试为纽约地铁实现一个简单的图形数据库 总共有493个站点,带有标签:STOP和属性{name:“STOP name”},例如: 总共有566个关系[:DIRECT{dist:…}] 我试图得到的是一个节点列表和它们之间的总和(dist),从一个特定的停止点开始,只返回距离某个总和(dist)远的节点,当我限制关系的数量时,cypher查询可以完美运行,例如:Neo4j 具有无限关系的密码查询将花费永远的时间,neo4j,cypher,Neo4j,Cypher,我正在尝试为纽约地铁实现一个简单的图形数据库 总共有493个站点,带有标签:STOP和属性{name:“STOP name”},例如: 总共有566个关系[:DIRECT{dist:…}] 我试图得到的是一个节点列表和它们之间的总和(dist),从一个特定的停止点开始,只返回距离某个总和(dist)远的节点,当我限制关系的数量时,cypher查询可以完美运行,例如: match p=(n:STOP {name:"Van Cortlandt Park - 242 St"})-[:DIRECT*1.
match p=(n:STOP {name:"Van Cortlandt Park - 242 St"})-[:DIRECT*1..10]-(m:STOP)
WITH n,m,
reduce(acc=0, x in relationships(p)| acc + x.dist) as x
WHERE x < 5
return n.name, m.name, x
limit 10
match p=(n:STOP{name:“Van Cortlandt Park-242 St”})-[:DIRECT*1..10](m:STOP)
与n,m,
将(acc=0,关系(p)| acc+x.dist)中的x减少为x
其中x<5
返回n.name,m.name,x
限制10
当我指定-[:DIRECT*]时,问题就开始了-
大约10分钟后,查询几乎失败,出现未知错误
以下是具有限制的查询分析:
==> +--------------------------------------------------------------------------------+
==> | n.name | m.name | x |
==> +--------------------------------------------------------------------------------+
==> | "Van Cortlandt Park - 242 St" | "238 St" | 0.33 |
==> | "Van Cortlandt Park - 242 St" | "231 St" | 0.78 |
==> | "Van Cortlandt Park - 242 St" | "Marble Hill - 225 St" | 1.1800000000000002 |
==> | "Van Cortlandt Park - 242 St" | "215 St" | 1.6400000000000001 |
==> | "Van Cortlandt Park - 242 St" | "207 St" | 2.02 |
==> | "Van Cortlandt Park - 242 St" | "Dyckman St" | 2.47 |
==> | "Van Cortlandt Park - 242 St" | "191 St" | 2.89 |
==> | "Van Cortlandt Park - 242 St" | "181 St" | 3.3400000000000003 |
==> | "Van Cortlandt Park - 242 St" | "168 St - Washington Hts" | 4.04 |
==> | "Van Cortlandt Park - 242 St" | "157 St" | 4.5600000000000005 |
==> +--------------------------------------------------------------------------------+
==> 10 rows
==>
==> ColumnFilter(0)
==> |
==> +Slice
==> |
==> +Extract(0)
==> |
==> +Filter(0)
==> |
==> +ColumnFilter(1)
==> |
==> +Extract(1)
==> |
==> +ExtractPath
==> |
==> +Filter(1)
==> |
==> +TraversalMatcher
==>
==> +------------------+------+--------+-------------+--------------------------------+
==> | Operator | Rows | DbHits | Identifiers | Other |
==> +------------------+------+--------+-------------+--------------------------------+
==> | ColumnFilter(0) | 10 | 0 | | keep columns n.name, m.name, x |
==> | Slice | 10 | 0 | | { AUTOINT3} |
==> | Extract(0) | 10 | 40 | | n.name, m.name |
==> | Filter(0) | 10 | 0 | | x < { AUTOINT2} |
==> | ColumnFilter(1) | 10 | 0 | | keep columns n, m, x |
==> | Extract(1) | 10 | 110 | | x |
==> | ExtractPath | 10 | 0 | p | |
==> | Filter(1) | 10 | 10 | | hasLabel(m:STOP(4)) |
==> | TraversalMatcher | 10 | 45 | | m, UNNAMED52, m |
==> +------------------+------+--------+-------------+--------------------------------+
==>+--------------------------------------------------------------------------------+
==>| n.name | m.name | x|
==> +--------------------------------------------------------------------------------+
==>|“范考特兰特公园-242街”|“238街”| 0.33|
==>|“范考特兰特公园-242街”|“231街”| 0.78|
==>|“范考特兰特公园242街”|“大理石山225街”| 1.1800000000000002|
==>|“范考特兰特公园-242街”|“215街”| 1640000000000001|
==>|“范考特兰特公园-242街”|“207街”| 2.02|
==>|“范考特兰特公园-242街”|“戴克曼街”| 2.47|
==>|“范考特兰特公园-242街”|“191街”| 2.89|
==>|“范考特兰特公园-242街”|“181街”| 3.34000000000000003|
==>|“范考特兰特公园-242街”|“168街-华盛顿Hts”| 4.04|
==>|“范考特兰特公园-242街”|“157街”| 4.5600000000000005|
==> +--------------------------------------------------------------------------------+
=>10行
==>
==>列过滤器(0)
==> |
==>+片
==> |
==>+提取(0)
==> |
==>+过滤器(0)
==> |
==>+列过滤器(1)
==> |
==>+摘录(1)
==> |
==>+提取路径
==> |
==>+过滤器(1)
==> |
==>+遍历匹配器
==>
==> +------------------+------+--------+-------------+--------------------------------+
==>|运算符|行|数据命中数|标识符|其他|
==> +------------------+------+--------+-------------+--------------------------------+
==>| ColumnFilter(0)| 10 | 0 | |保留n.name、m.name、x列|
==>|切片| 10 | 0 |{AUTOINT3}|
==>|摘录(0)| 10 | 40 | | n.name,m.name|
==>|过滤器(0)| 10 | 0 | | x<{AUTOINT2}|
==>|列过滤器(1)| 10 | 0 | |保留n、m、x列|
==>|摘录(1)| 10 | 110 | x|
==>|提取路径| 10 | 0 | p ||
==>|过滤器(1)| 10 | 10 | | hasLabel(m:停止(4))|
==>| TraversalMatcher | 10 | 45 | m,未命名52,m|
==> +------------------+------+--------+-------------+--------------------------------+
谢谢 你能分享你的数据库吗?你有:STOP(name)的索引吗?问题是,如果你不指定一个限制和方向,它将生成大量的路径,并且当它找到你的10条路径时,它不会立即停止。您是否尝试了带有
cypher 2.1.实验性前缀的新查询计划器?@MichaelHunger,在:STOP(name)上创建索引-之前已经完成,所以是的。完全同意你的观点,是的,我尝试添加了“cypher 2.1.实验”——同样的结果。我不确定导出图形的最佳方式是什么,以便我可以共享它。另外,我已经读了很多书,如果我使用Java Core,我可能会得到更好的结果-你认为呢?只需压缩graph.db目录并将其放在dropbox上。你很可能会更快地使用核心api,我只是想看看为什么这个密码查询在你的数据集上速度太慢。请通过neo4j.org将db发送给michael
==> +--------------------------------------------------------------------------------+
==> | n.name | m.name | x |
==> +--------------------------------------------------------------------------------+
==> | "Van Cortlandt Park - 242 St" | "238 St" | 0.33 |
==> | "Van Cortlandt Park - 242 St" | "231 St" | 0.78 |
==> | "Van Cortlandt Park - 242 St" | "Marble Hill - 225 St" | 1.1800000000000002 |
==> | "Van Cortlandt Park - 242 St" | "215 St" | 1.6400000000000001 |
==> | "Van Cortlandt Park - 242 St" | "207 St" | 2.02 |
==> | "Van Cortlandt Park - 242 St" | "Dyckman St" | 2.47 |
==> | "Van Cortlandt Park - 242 St" | "191 St" | 2.89 |
==> | "Van Cortlandt Park - 242 St" | "181 St" | 3.3400000000000003 |
==> | "Van Cortlandt Park - 242 St" | "168 St - Washington Hts" | 4.04 |
==> | "Van Cortlandt Park - 242 St" | "157 St" | 4.5600000000000005 |
==> +--------------------------------------------------------------------------------+
==> 10 rows
==>
==> ColumnFilter(0)
==> |
==> +Slice
==> |
==> +Extract(0)
==> |
==> +Filter(0)
==> |
==> +ColumnFilter(1)
==> |
==> +Extract(1)
==> |
==> +ExtractPath
==> |
==> +Filter(1)
==> |
==> +TraversalMatcher
==>
==> +------------------+------+--------+-------------+--------------------------------+
==> | Operator | Rows | DbHits | Identifiers | Other |
==> +------------------+------+--------+-------------+--------------------------------+
==> | ColumnFilter(0) | 10 | 0 | | keep columns n.name, m.name, x |
==> | Slice | 10 | 0 | | { AUTOINT3} |
==> | Extract(0) | 10 | 40 | | n.name, m.name |
==> | Filter(0) | 10 | 0 | | x < { AUTOINT2} |
==> | ColumnFilter(1) | 10 | 0 | | keep columns n, m, x |
==> | Extract(1) | 10 | 110 | | x |
==> | ExtractPath | 10 | 0 | p | |
==> | Filter(1) | 10 | 10 | | hasLabel(m:STOP(4)) |
==> | TraversalMatcher | 10 | 45 | | m, UNNAMED52, m |
==> +------------------+------+--------+-------------+--------------------------------+