Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Neo4j中使用Cypher合并同一社区的节点?_Neo4j_Cypher_Neo4j Apoc_Graph Data Science - Fatal编程技术网

如何在Neo4j中使用Cypher合并同一社区的节点?

如何在Neo4j中使用Cypher合并同一社区的节点?,neo4j,cypher,neo4j-apoc,graph-data-science,Neo4j,Cypher,Neo4j Apoc,Graph Data Science,有一个图,其每个节点都包含属性communityId,以指示节点属于哪个社区。节点通过链接关系连接,该关系包含权重属性 我想要的是将同一社区的那些节点合并成一个大节点。这些大节点(又名社区)之间的链接必须合理地合成/组合:链接的权重属性必须根据每个社区中相互连接的单个节点进行相加。必须尊重链接的方向 在结果图中,我将只看到连接的社区节点 最接近的函数是,functionapoc.refactor.mergeNodes()。但是,我对结果不满意,因为: 问题1:结果社区节点具有自链接 问题2:尽

有一个图,其每个节点都包含属性
communityId
,以指示节点属于哪个社区。节点通过
链接
关系连接,该关系包含
权重
属性

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

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

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

  • 问题1:结果社区节点具有自链接
  • 问题2:尽管文档中有说明,但链接的权重并未合并
问题1可以通过多写一个密码来删除自链接来解决。但是问题2只能通过对图的低级访问来解决(如上面的
mergeNodes()

有没有什么优雅的方法可以让我想要的图(社区节点)一气呵成?或者至少,问题2必须以某种方式解决

再现性 图表:

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)

密码:

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

系统要求
  • Windows 8.1 x64
  • Neo4j桌面v1.3.4(引擎v4.1.1.)
  • APOC v4.1.0.2
  • 图形数据科学图书馆v1.3.2

    • 我不太清楚APOC为什么不合并您示例中的关系。但是,这里有一个密码查询可以帮助您开始:

      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
      
      匹配(n:User)-[r]->(v:User)
      其中n.communityId v.communityId//放弃自循环
      n.communityId为comId1,v.communityId为comId2,总和(r.重量)为w
      MERGE(su1:SuperUser{communityId:comId1})//为n.communityId创建或获取合并节点
      MERGE(su2:SuperUser{communityId:comId2})//为v.communityId创建或获取节点
      合并(su1)-[r:超级链接]->(su2)
      在创建时设置r.weight=w//在创建关系时设置关系权重
      返回su1、su2、r
      
      这将创建以下节点和关系:


      我不太清楚APOC为什么不合并您示例中的关系。但是,这里有一个密码查询可以帮助您开始:

      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
      
      匹配(n:User)-[r]->(v:User)
      其中n.communityId v.communityId//放弃自循环
      n.communityId为comId1,v.communityId为comId2,总和(r.重量)为w
      MERGE(su1:SuperUser{communityId:comId1})//为n.communityId创建或获取合并节点
      MERGE(su2:SuperUser{communityId:comId2})//为v.communityId创建或获取节点
      合并(su1)-[r:超级链接]->(su2)
      在创建时设置r.weight=w//在创建关系时设置关系权重
      返回su1、su2、r
      
      这将创建以下节点和关系:


      谢谢。这是一个很好的起点。虽然Cypher没有删除原始图形,但我想我还可以执行
      MATCH(n)而不是n:SuperUser DETACH delete n
      。谢谢。这是一个很好的起点。虽然Cypher没有删除原始图形,但我想我还可以执行
      MATCH(n)而不是n:SuperUser DETACH delete n