带有两个 OPTIONAL MATCH 和两个单独的 WITH 语句的 Cypher 查询
Posted
技术标签:
【中文标题】带有两个 OPTIONAL MATCH 和两个单独的 WITH 语句的 Cypher 查询【英文标题】:Cypher query with two OPTIONAL MATCH and two separate WITH statements 【发布时间】:2015-03-09 23:36:59 【问题描述】:我正在尝试在 Cypher 中编写一个创建/更新查询,除了普通 MATCH 来查找“起始节点”之外,还有两个 OPTIONAL MATCH 查询从该节点搜索可能存在的两种类型的关系(和他们指向的节点)。基于这些,我希望能够使用 WITH(以及 WHERE 排除 NULL)进行一些操作。当只有一个 OPTIONAL MATCH 和一个 WITH 时,这非常有效,但是在第二个 WITH 中无法看到来自 OPTIONAL MATCH 的变量(我假设第二个 WITH 在第一个的上下文中运行)。
那么,我该怎么做呢,让我们来看下面的例子:
MATCH (nodeid:123)
OPTIONAL MATCH p1=(node)-[:TYPE_ONE]->()
OPTIONAL MATCH p2=(node)-[:TYPE_TWO]->()
CREATE (newNodeid=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_ONEvalue: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_TWOvalue:relTwo.value]->(nodeTwo)
请注意,可能存在第一、第二、两者或不存在任何一种关系(包括多重关系)。
【问题讨论】:
【参考方案1】:尝试以下查询:
MATCH (nodeid:123)
OPTIONAL MATCH p1=(node)-[:TYPE_ONE]->()
OPTIONAL MATCH p2=(node)-[:TYPE_TWO]->()
CREATE (newNodeid: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_ONEvalue:relOne.value]->(nodeOne)
WITH last(relationships(p2)) as relTwo, last(nodes(p2)) as nodeTwo, newNode
WHERE nodeTwo IS NOT NULL
CREATE (newNode)-[:TYPE_TWOvalue:relTwo.value]->(nodeTwo);
解释与您的查询的差异:
-
修正了一些错别字:
id=234]
已更改为 id:123
。
删除了不必要的 newNode
重命名。
我的查询将p2
添加到第一个WITH
子句中,这是使其可用于以下子句的唯一方法。
【讨论】:
以上是关于带有两个 OPTIONAL MATCH 和两个单独的 WITH 语句的 Cypher 查询的主要内容,如果未能解决你的问题,请参考以下文章
带有两个指标的 pine 脚本,一个覆盖在图表上,另一个单独覆盖?
我应该对带有 Redis 的 Pub 和 Sub 使用单独的连接吗?