Cypher查询两个OPTIONAL MATCH和两个单独的WITH语句

时间:2015-03-09 23:37:00

标签: neo4j cypher

我正在尝试在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)

请注意,可能存在第一,第二,两者或任何关系(包括倍数)。

1 个答案:

答案 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);

与查询的差异说明:

  1. 修正了一些拼写错误:id=234]已更改为id:123}
  2. 删除了newNode
  3. 的不必要重命名
  4. 我的查询将p2添加到第一个WITH子句中,这是使其可用于以下子句的唯一方法。