是否可以执行以下操作?
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进行可选匹配,我不会遇到相同的错误,但是我注意到长路径的可选匹配即使它们总是从绑定节点开始,也会做一些奇怪的事情(有时我会遇到与我感觉缺失的节点相关的错误我不应该这么做,因为它是可选的匹配-但这是另一篇文章)。
答案 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
用于避免在MERGE
为n
时调用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)