通过属性字段合并节点

时间:2018-08-31 04:39:47

标签: neo4j cypher

我有多个共享同一属性字段的节点,我需要将这些节点合并为一个,并同时将所有其他属性复制到合并节点中。

示例:

(n1,g,p1)(n2,g,p2)(n3,g,p3)=>(n,g,p1,p2,p3)

请注意,我不需要apoc解决方案,因为用户定义的功能在我正在使用的CAPS中不起作用

更新:

geohash是具有重复值的字段,因此我想通过该字段合并节点。

CAPS团队给了我这个密码查询,以使它具有与初始图不同的geohash节点:

  CATALOG CREATE GRAPH temp {
    FROM GRAPH session.inputGraph
    MATCH (n)
    WITH DISTINCT n.geohash AS geohash
    CONSTRUCT 
    CREATE (:HashNode {geohash: geohash})
    RETURN GRAPH
   }

,但是仍然缺少合并节点上其余属性的收集。

我对关系没有问题,因为我们以后可以从初始图中复制它们:

 FROM GRAPH inputGraph
 MATCH (from)-[via]->(to)
 FROM GRAPH temp
 MATCH (n), (m)
 WHERE from.geohash = n. AND  AND to.geohash = m.geohash
 CONSTRUCT 
   CREATE (n)-[COPY OF via]->(m)
 RETURN GRAPH

1 个答案:

答案 0 :(得分:1)

在纯密码中不可能100%做到这一点,这就是为什么要执行APOC程序的原因。

要合并两个节点,必须:

  • 创建具有所有属性的合并节点
  • 创建合并节点上所有节点的关系

在第一部分中,可以使用密码。示例:

MATCH (n) WHERE id(n) IN [106, 68]
WITH collect(n) AS nodes
  CREATE (new:MyNode)
  with nodes, new
  UNWIND nodes as node
    SET new += properties(node)
    RETURN new

但是对于第二部分,您需要能够创建具有动态类型和动态方向的关系,并且在密码中是不允许的...