Neo4j - OPTIONAL MATCH的多项任务

时间:2014-02-19 12:33:35

标签: cypher neo4j

我是Ne04j的新手,我必须针对以下情况编写一个密码查询 enter image description here

Possiblity 1:

  • 使用 data1 删除用户 NEXT 关系。

  • 用户 data2 创建 NEXT 关系。

  • data2 data1 创建 NEXT 关系。

Possiblity 2:

  • 用户 data2 创建 NEXT 关系。

问题在于 Possiblity 1,我无法删除关系,同时create关系。

我尝试了以下查询,但失败了

match (a:user{id:12345}) 
optional match (a)-[r:NEXT]->(b:data) 
delete r 
create unique (a)-[:NEXT]->(c:data{id:1})-[:NEXT]->(b) 
with a 
create unique (a)-[:NEXT]->(c:data{id:2})

请帮助,提前致谢

2 个答案:

答案 0 :(得分:1)

使用下面的密码查询。

MATCH (a:user {id: "12345"}) 
WITH a  
MERGE (a)-[:NEXT]->(c:data {id: "2"}) 
WITH a,c
MATCH (a)-[r:NEXT]->(b:data) 
WHERE b<>c 
WITH a, collect(r) AS rels, collect(b) AS bs, c  
FOREACH (t IN range(0,length(rels)-1)| 
FOREACH (t1 IN [bs[t]]| 
FOREACH (t2 IN [rels[t]]|
MERGE c-[:NEXT]->t1 
DELETE t2))) 
RETURN a,c

上述查询将创建与node a和数据node cid: "2"的新关系,如果之前连接的任何其他数据类型节点将在新node c之后追加

答案 1 :(得分:1)

最后,我找到了解决方案。我不确定这个查询是否完美,但是这个工作只需几毫秒就可以执行。

我发布这个答案是为了帮助其他人有同样的怀疑

MATCH (a:user{id:12345})
MERGE (a)-[r:NEXT]->(b:data)
ON CREATE SET b.id=1
with a,r,b
match (a)-[r]->(b)
where b.id<>1
CREATE (a)-[k:NEXT]->(c:data{id:1})-[m:NEXT]->(b)
delete r

希望这有帮助,谢谢