带有两个 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 脚本,一个覆盖在图表上,另一个单独覆盖?

带有片段的两个面板 UI 与单独的活动

我应该对带有 Redis 的 Pub 和 Sub 使用单独的连接吗?

Java 8 用 Optional 替换两个空检查

BigQuery SQL Select 返回键值对而不是两个单独的列

NEO4J Optional Match when null, 整个查询返回为空