我正在尝试在Cypher中编写单个创建/更新查询,除了正常的MATCH以找到“起始节点”之外,还有两个可选的MATCH查询,用于搜索可能存在的该节点的两种类型的关系(和他们指向的节点)。基于这些,我希望能够使用WITH(以及WHERE来排除NULL)进行一些操作。当只有一个OPTIONAL MATCH和一个WITH时,这很有效,但是在第二个WITH中,OPTIONAL MATCH中的变量的可见性是不可能的(我假设,第二个WITH在第一个WITH的上下文中运行)。
那么,我该怎么做呢,让我们看看下面的例子:
MATCH (node{id:123})
OPTIONAL MATCH p1=(node)-[:TYPE_ONE]->()
OPTIONAL MATCH p2=(node)-[:TYPE_TWO]->()
CREATE (newNode{id=234])-[:TYPE_THREE]->(node)
WITH last(relationships(p1)) as relOne, last(nodes(p1)) as nodeOne, newNode as createdNode
WHERE nodeOne IS NOT NULL
CREATE (createdNode)-[:TYPE_ONE{value:relOne.value}]->(nodeOne)
WITH last(relationships(p2)) as relTwo, last(nodes(p2)) as nodeTwo, newNode as createdNode
WHERE nodeTwo IS NOT NULL
CREATE (createdNode)-[:TYPE_TWO{value:relTwo.value}]->(nodeTwo)
请注意,可能存在第一,第二,两者或任何关系(包括倍数)。
答案 0 :(得分:0)
尝试以下查询:
MATCH (node{id:123})
OPTIONAL MATCH p1=(node)-[:TYPE_ONE]->()
OPTIONAL MATCH p2=(node)-[:TYPE_TWO]->()
CREATE (newNode{id:234})-[:TYPE_THREE]->(node)
WITH last(relationships(p1)) as relOne, last(nodes(p1)) as nodeOne, newNode, p2
WHERE nodeOne IS NOT NULL
CREATE (newNode)-[:TYPE_ONE{value:relOne.value}]->(nodeOne)
WITH last(relationships(p2)) as relTwo, last(nodes(p2)) as nodeTwo, newNode
WHERE nodeTwo IS NOT NULL
CREATE (newNode)-[:TYPE_TWO{value:relTwo.value}]->(nodeTwo);
与查询的差异说明:
id=234]
已更改为id:123}
。newNode
。p2
添加到第一个WITH
子句中,这是使其可用于以下子句的唯一方法。