gpt4 book ai didi

java - neo4j:用一个节点替换具有相同属性的多个节点

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:44:40 26 4
gpt4 key购买 nike

假设我在 neo4j 中有一个节点属性“名称”。现在我想通过标识所有具有相同名称的节点来强制给定名称最多只有一个节点。更准确地说:如果有三个名称为“dog”的节点,我希望它们只被一个名称为“dog”的节点替换,即:

  1. 收集所有原始三个节点的所有属性。
  2. 具有附加到原始三个节点的所有弧。

背景如下:在我的图表中,通常有几个同名的节点应该被视为“相等”(尽管有些节点比其他节点具有更丰富的属性信息)。将 a.name = b.name 放在 WHERE 子句中非常慢。

编辑:我忘了说我的 Neo4j 目前是 2.3.7 版(我无法更新它)。

第二次编辑:节点和可能的弧有一个已知的标签列表。节点的类型是已知的。

第三次编辑:我想从 Java 调用上面的“节点崩溃”过程,因此 Cypher 查询和过程代码的混合也是一个有用的解决方案。

最佳答案

我用以下架构制作了一个测试用例:

CREATE (n1:TestX {name:'A', val1:1})
CREATE (n2:TestX {name:'B', val2:2})
CREATE (n3:TestX {name:'B', val3:3})
CREATE (n4:TestX {name:'B', val4:4})
CREATE (n5:TestX {name:'C', val5:5})

MATCH (n6:TestX {name:'A', val1:1}) MATCH (m7:TestX {name:'B', val2:2}) CREATE (n6)-[:TEST]->(m7)
MATCH (n8:TestX {name:'C', val5:5}) MATCH (m10:TestX {name:'B', val3:3}) CREATE (n8)<-[:TEST]-(m10)

产生以下输出的结果:

enter image description here

其中节点 B 实际上是相同的节点。这是我的解决方案:

//copy all properties
MATCH (n:TestX), (m:TestX) WHERE n.name = m.name AND ID(n)<ID(m) WITH n, m SET n += m;

//copy all outgoing relations
MATCH (n:TestX), (m:TestX)-[r:TEST]->(endnode) WHERE n.name = m.name AND ID(n)<ID(m) WITH n, collect(endnode) as endnodes
FOREACH (x in endnodes | CREATE (n)-[:TEST]->(x));

//copy all incoming relations
MATCH (n:TestX), (m:TestX)<-[r:TEST]-(endnode) WHERE n.name = m.name AND ID(n)<ID(m) WITH n, collect(endnode) as endnodes
FOREACH (x in endnodes | CREATE (n)<-[:TEST]-(x));

//delete duplicates
MATCH (n:TestX), (m:TestX) WHERE n.name = m.name AND ID(n)<ID(m) detach delete m;

结果输出如下所示:

enter image description here

必须标明,你必须知道各种关系的类型。

所有属性都从具有“较高”ID 的节点复制到具有“较低”ID 的节点。

关于java - neo4j:用一个节点替换具有相同属性的多个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38871858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com