取消缠绕多个关系并收集节点和关系-使用NULL

时间:2019-10-21 20:50:19

标签: neo4j cypher

是否可以执行以下操作?

MATCH (main {Identifier: "Main"})
UNWIND
  [(main)-[:MULTI_JUMP_PATH1]->(n1)-[rel1:REL]->(end1) | n1] +
  [(main)-[:MULTI_JUMP_PATH2]->(n2)-[rel2:REL]->(end2) | n2] AS node
UNWIND
  [(main)-[:MULTI_JUMP_PATH1]->(n1)-[rel1:REL]->(end1) | end1] +
  [(main)-[:MULTI_JUMP_PATH2]->(n2)-[rel2:REL]->(end2) | end2] AS end
UNWIND
  [(main)-[:MULTI_JUMP_PATH1]->(n1)-[rel1:REL]->(end1) | rel1] +
  [(main)-[:MULTI_JUMP_PATH2]->(n2)-[rel2:REL]->(end2) | rel2] AS rel
RETURN DISTINCT main, node, end, rel

基本上,我正在寻找一种更直接的方法来从main开始并获得与之等效的结果:

(node=n1+n2)-[rel=rel1+rel2:REL]->(end=end1+end2)

不失主力。我最终想要得到的结果是:

FOREACH (o IN CASE WHEN end IS NULL THEN [rel] ELSE [] END | SET main.property=rel.property*n.property)

现在,我连续运行几个查询并检查所有查询之间的结果,但是似乎会有一种更有效的方式来使用密码。

此外,当理解列表为null时,我似乎无法使UNWIND停止丢失标识符。

例如:

CASE 
WHEN  [(main)-[:MULTI_JUMP_PATH1]->(n1)-[rel1:REL]->(end1) | n1] +
  [(main)-[:MULTI_JUMP_PATH2]->(n2)-[rel2:REL]->(end2) | n2] = []
THEN []
ELSE 
 [(main)-[:MULTI_JUMP_PATH1]->(n1)-[rel1:REL]->(end1) | n1] +
  [(main)-[:MULTI_JUMP_PATH2]->(n2)-[rel2:REL]->(end2) | n2]
END AS n

始终会给出错误“ Neo.DatabaseError.Statement.ExecutionFailed:表达式需要向其拥有的Pipe注册,因此配置文件知道在何处报告数据库命中”。我还尝试过每次都使用= null / null和= [null] / [null]相同的错误。如果我对collects进行可选匹配,我不会遇到相同的错误,但是我注意到长路径的可选匹配即使它们总是从绑定节点开始,也会做一些奇怪的事情(有时我会遇到与我感觉缺失的节点相关的错误我不应该这么做,因为它是可选的匹配-但这是另一篇文章)。

2 个答案:

答案 0 :(得分:1)

此代码段应该对您有用:

...

OPTIONAL MATCH (original)-[r:HAS_RELATIONSHIP]->(n)
FOREACH(x IN CASE WHEN n IS NOT NULL THEN [1] END |
    MERGE (duplicate)-[r2:HAS_RELATIONSHIP]->(n)
    SET r2 = r
)

...

FOREACH用于避免在MERGEn时调用NULL,这会导致错误。 SET可用于(如上所示)将 all 属性从一个关系(或节点)复制到另一关系(或节点)。

答案 1 :(得分:0)

我将在完成质量检查后更新帖子,但我将尝试:

WITH original, duplicate, 
[(original)-[rel1:HAS_RELATIONSHIP]->(node) | node {id: id(node), Prop: rel1.Prop}] as list
UNWIND CASE WHEN size(list)=0 THEN [null] ELSE list END AS nodes
FOREACH(o IN CASE WHEN NOT nodes is NULL THEN [nodes] ELSE [] END | 
            MERGE (n {id(n): nodes.id})
            MERGE (duplicate)-[rel2:HAS_RELATIONSHIP]->(n)
            SET rel2.Prop=nodes.Prop)