首页 > 解决方案 > 节点已删除,无法用于创建关系

问题描述

我在 Neo4j 中有一个电网的节点链接模型(它是一个图表),所以它应该像手套一样适合。节点和链接是它们自己的对象,可以以抽象的方式遍历。Link有一个起始节点(:Link) - [:begint_bij] -> (:Node) 和一个结束节点 (:Link) – [:eindigt_bij] –> (:Node) 每个 :Node 和 :Link 都引用一个或多个对象。链接和节点由它们在此模型中的引用唯一定义。

该模型是由面向对象的 GIS 模型生成的,并且由于生成方法(我对此没有影响),冗余节点链接(对)在数据集中。

Node-Link能源网格图模型图片

在图片中,我们看到围绕电缆的节点云(紫色)和链接(绿色)。

您可以通过模式清楚地看到冗余对:Node-Link 对,其中节点仅与(电缆、gisreferences 和链接)有关系,而链接仅与(电缆、gisreferences 和节点)有关系

为了删除冗余的节点链接对,我提出了这个查询:

"MATCH (fld:e_lv_function_cable ) where not exists(fld.done) Return fld",
"match (fld) - [:GenObject] - (fn:Node)
 match (fn) - [:begint_bij] - (l1:Link)
with [(fn) - [] - (obj1) | labels(obj1)] AS conn1, [(l1) - [] - (obj2) | labels(obj2)] AS conn2, fn, l1, fld
where all( lb1 IN  conn1 where lb1[0] in  ['e_lv_function_cable','GisReference','Link'] )
  and all( lb2 IN  conn2 where lb2[0] in  ['e_lv_function_cable','GisReference','Node'] )
with l1, fn, fld
match (l1) - [:eindigt_bij] - (n2) 
match (l2:Link) - [r] - (fn) - [:begint_bij] - (l1) 
Call apoc.do.when (
  n2 is not null and l2 is not null and r is not null,
  'Call apoc.create.relationship(l2, type(r), {}, n2) YIELD rel Detach Delete l1, fn',
  '',
  {n2: n2, l2: l2, r: r, l1: l1, fn: fn}) YIELD value
with fld
set fld.done=true
", {batchSize:100, parallel:false}) yield batches, total return batches, total

它完成了这项工作。

但是在某些情况下,我会收到一个错误(在调试日志中):

调用过程失败apoc.do.when:原因:org.neo4j.graphdb.NotFoundException:Node[] 已删除,不能用于创建关系

而有时:

调用过程失败apoc.do.when:原因:java.lang.IllegalStateException:内核 API 返回不存在的关系类型:-1

并且 set done=true 永远不会完成。

这对我来说几乎是有意义的。

任何人都可以请:

谢谢。

标签: neo4jcypher

解决方案


推荐阅读