Neo4j-设置在foreach never end中

Neo4j-设置在foreach never end中,neo4j,Neo4j,我有一个数据库,代表一个学校项目的城市地图。 每个节点表示街道中的一个点,每个关系表示一段道路,两个节点之间的距离作为特性。 我通过使用java接口解析XML文件将其导入Neo4j。 但是由于XML文件的编码方式,我有很多节点没有用,因为它们只是表示街道中的中间位置,而不是交叉点或指示新街道 所以,我试着取两个交叉点之间的每段道路的末端,在这两个节点之间创建一个关系,然后求出街道上每个关系的距离之和 对于这些命令中的每一个,我都使用neo4j的浏览器客户机,但在我的计算机上有一个数据库。 首先,

我有一个数据库,代表一个学校项目的城市地图。 每个节点表示街道中的一个点,每个关系表示一段道路,两个节点之间的距离作为特性。 我通过使用java接口解析XML文件将其导入Neo4j。
但是由于XML文件的编码方式,我有很多节点没有用,因为它们只是表示街道中的中间位置,而不是交叉点或指示新街道

所以,我试着取两个交叉点之间的每段道路的末端,在这两个节点之间创建一个关系,然后求出街道上每个关系的距离之和

对于这些命令中的每一个,我都使用neo4j的浏览器客户机,但在我的计算机上有一个数据库。 首先,我使用以下命令标记所有要销毁的关系和节点:

match ()-[r]-(n)-[t]-()
with r,n,t,size(n--()) as degree
where degree=2 and r.name=t.name
set r.toDestroy=1,t.toDestroy=1,n.toDestroy=1
然后我得到每一对重要的节点

match (a)-[r* {toDestroy;1}]-(b)
where a.toDestroy is NULL and b.toDestroy is NULL and all (x in r where x.name=(r[0]).name)
return a,r,b
这个命令返回我所要求的,所以现在我在(a)和(b)之间创建一个新的关系,并设置它的距离

match (a)-[r* {toDestroy;1}]-(b)
where a.toDestroy is NULL and b.toDestroy is NULL and all (x in r where x.name=(r[0]).name)
merge (a)-[t:TRONCON_DE_VOIE]->(b)
set t.distance=0,t.name=(r[0]).name
foreach(x in r|set t.distance=t.distance+r.distance)
这就是我的问题所在:这个请求永远不会返回,客户机只是告诉我它正在运行。我不明白为什么,因为即使我隔离了两个节点及其链接,它也不起作用。如果我在foreach中放入类似(
set x.distance=1
)的内容,它也不起作用


我在网上浏览了一下,似乎没有人和我有同样的问题。此外,如果我创建另一个DB,并用随机节点填充它,然后尝试一个类似的命令,它就会结束。因此,它可能来自数据库本身,但我不明白为什么。

这可能是因为最后一个子句将调用
SET
N次,其中N基本上是具有
到destroy:1
的关系的总数

下面是一个更高效的查询,它完全不使用
SET
子句:

MATCH (a)-[r* {toDestroy:1}]-(b)
WHERE a.toDestroy is NULL AND b.toDestroy is NULL AND ALL(x in r where x.name=(r[0]).name)
WITH a, b, (r[0]).name AS name, REDUCE(s = 0, x IN r | s + x.distance) AS total
merge (a)-[t:TRONCON_DE_VOIE {distance: total, name: name}]->(b);
基本上,您应该始终尝试在内存中进行计算,而不在DB中存储临时值

[编辑]

顺便说一下,可变长度路径搜索很容易“永远运行”和/或耗尽内存,因为它们具有指数复杂性。如果路径上每个节点的平均关系数为
R
,搜索深度为
d
,则不同路径的数量大致为
R^d
。因此,通常,您希望通过指定可接受的“小”上限来限制可变长度路径搜索的深度,如:

MATCH (a)-[r*..10 {toDestroy:1}]-(b)

谢谢你的回答,它让我解决了我的问题。但是对于记录,你给出的查询也不起作用,但是如果你把[r*1..10{toDestroy:1}]放进去,它确实起作用,因为我现在不太明白。可变长度路径搜索很容易“永远运行”和/或耗尽内存,因为它们具有指数复杂性。如果路径上每个节点的平均关系数为
R
,搜索深度为
d
,则不同路径的数量大致为
R^d
。因此,通常,您希望限制可变长度路径搜索的深度。我将把这一点补充到我的答案中。