首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Neo4j中将同一社区的节点与Cypher合并?

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

Stack Overflow用户
提问于 2020-09-11 22:12:00
回答 1查看 516关注 0票数 1

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

我想要的是将同一个社区的这些节点合并成一个大节点。这些大节点之间的链接(又名。(社区)必须合理地合成/组合():必须根据每个社区中连接到另一个社区中的单个节点,将链路的weight属性相加。必须尊重链接的方向。

在结果图中,我将只看到连接的社区节点。

最近的函数是合并节点,函数apoc.refactor.mergeNodes()。但是,我对结果不满意,因为:

  • 问题1:结果社区节点具有自链接。
  • 问题2:虽然文档中这样说,但是链接的权重并没有合并。

问题1可以通过多写一个Cypher来删除自链接来解决.但是问题2只能通过对图形的低级别访问(如上面的mergeNodes() )来解决。

有什么优雅的方法可以在one go中拥有我想要的图形(社区节点)吗?或者至少,问题2必须以某种方式解决。

再现性

图表:

代码语言:javascript
复制
CREATE (a:User {name: "A", communityId: 2}), (b:User {name: "B", communityId: 2}), (c:User {name: "C", communityId: 2}), (x:User {name: "X", communityId: 1}), (y:User {name: "Y", communityId: 1}), (z:User {name: "Z", communityId: 1}), (w:User {name: "W", communityId: 1}), (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)

赛弗:

代码语言:javascript
复制
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

系统要求

  • Windows8.1 x64
  • Neo4j桌面v1.3.4 (Engine v4.1.1.)
  • APOC v4.1.0.2
  • 图表数据科学图书馆v1.3.2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-12 07:28:46

我不太清楚为什么APOC不合并您的示例中的关系。但是,下面是一个Cypher查询,可以让您开始:

代码语言:javascript
复制
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

它创建以下节点和关系:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63854932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档