我正在使用来自 Neo4j 的 Property Graph 和 Cypher。如标题中所述,我正在尝试删除许多节点,这些节点可以从另一个节点到达而不通过其他节点,并且只有 1 个传入关系。下面是这个案例的例子:
每个节点都有它的标签(大的,粗体字符)和一个名为 的属性nodeId
,它在节点之间是唯一的。关系的标签被省略了,因为由于某些原因我们不能依赖它。该nodeId
属性已使用唯一约束进行索引。
现在,从 node 开始A {nodeId: 1}
,我想删除它和所有其他节点:
A {nodeId: 1}
无需通过另一个 A-label 节点即可到达。- 只有 1 个传入关系
因此,将删除的节点是:A {nodeId: 1}
、B {nodeId: 3}
、C {nodeId: 4}
和C {nodeId: 8}
。
以下是我的密码代码:
MATCH p = (s:A {nodeId: 1 }) -[*1..10]-> (e)
WHERE NONE (x in NODES(p) WHERE x:A AND NOT x.nodeId = 1)
WITH s, e
MATCH (e) <-[r]- ()
WITH count(r) AS num_r, s, e
WHERE num_r < 2
DETACH DELETE e
DETACH DELETE s
该代码工作正常,但随着我的图表的增长,它变得越来越慢。一开始,它需要不到 10 毫秒。但是现在,当我有大约 100 万个节点和 200 万个关系时,它需要超过 1 秒。
我应该怎么做才能提高该代码的性能?
谢谢您的帮助。