如何在Neo4j中将相同社区的节点与Cypher合并?

问题描述

一个图,它的每个节点都包含属性communityId,以指示该节点所属的社区。节点以LINK关系连接,该关系包含weight属性

我想要的是将同一社区的那些节点合并为一个大节点。这些大节点(又称为社区)之间的链接必须合理地进行综合/组合:链接weight属性必须基于与每个社区连接的每个社区中的各个节点而加起来其他。必须遵守链接的方向。

在结果图中,我只会看到连接的 community 节点。

最接近的函数Merge Nodes函数apoc.refactor.mergeNodes()。但是,我对结果不满意,因为:

  • 问题1:结果社区节点具有自我链接
  • 问题2:尽管文档中说明,链接的权重未合并。

可以通过再写入一个Cypher来删除链接解决问题1。但是问题2只能通过对Graph的低级访问来解决(例如上面的mergeNodes())。

是否有一种优雅的方法可以使我想要的图形(社区节点)一次完成?至少,问题2必须以某种方式解决

可重复性

图:

CREATE (a:User {name: "A",communityId: 2}),(b:User {name: "B",(c:User {name: "C",(x:User {name: "X",communityId: 1}),(y:User {name: "Y",(z:User {name: "Z",(w:User {name: "W",(a)-[:LINK {weight: 1}]->(b),(b)-[:LINK {weight: 1}]->(c),(c)-[:LINK {weight: 1}]->(a),(b)-[:LINK {weight: 1}]->(z),(z)-[:LINK {weight: 1}]->(x),(z)-[:LINK {weight: 1}]->(w),(w)-[:LINK {weight: 1}]->(y),(y)-[:LINK {weight: 1}]->(x),(b)-[:LINK {weight: 1}]->(w)

enter image description here

密码:

MATCH (n:User)
WITH n.communityId AS communityId,COLLECT(n) AS nodes
CALL apoc.refactor.mergeNodes(nodes,{
    properties: {
        name: 'combine',communityId: 'discard',weight: 'combine'
    },mergeRels: true
})
YIELD node
RETURN node

enter image description here

系统要求

  • Windows 8.1 x64
  • Neo4j Desktop v1.3.4(Engine v4.1.1。)
  • APOC v4.1.0.2
  • 图形数据科学图书馆v1.3.2

解决方法

我不太确定为什么APOC没有在您的示例中合并这些关系。但是,这是一个Cypher查询,可以帮助您入门:

MATCH (n:User)-[r]->(v:User)
WHERE n.communityId <> v.communityId  // discard self loop
WITH n.communityId as comId1,v.communityId as comId2,sum(r.weight) as w
MERGE (su1:SuperUser {communityId: comId1})  // create or get merged node for n.communityId
MERGE (su2:SuperUser {communityId: comId2})  // create or get node for v.communityId
MERGE (su1)-[r:SUPER_LINK]->(su2)
ON CREATE SET r.weight = w  // set relationship weight when it is created
RETURN su1,su2,r

这将创建以下节点和关系:

Super node and super link

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...