检查可选匹配中的空值
Checking NULLS in an OPTIONAL MATCH
我有一个这样的密码查询:
MATCH (start:StartLabel)
OPTIONAL MATCH (start)-[:A]->(end1:EndLabel)
OPTIONAL MATCH (start)-[:B|C]->(middle:MiddleLabel)-[:D]->(end2:EndLabel)
WHERE NOT(end1 IS NULL AND end2 IS NULL)
RETURN *
在此图形模型中,有多种从 (start)
到达 (end)
的有效方法,但我想确保结果至少匹配一条可能的 OPTIONAL MATCH
路径。出于某种原因,我继续得到结果,其中 end1
和 end2
都是 NULL
与此 WHERE
子句。我是否遗漏了有关 Cypher 如何一起处理 OPTIONAL MATCH
和 WHERE
的信息?
我听说 WHERES
总是适用于最近的 (OPTIONAL )MATCH
,所以也许这会起作用?
MATCH (start:StartLabel)
OPTIONAL MATCH
(start)-[:A]->(end1:EndLabel),
(start)-[:B|C]->(middle:MiddleLabel)-[:D]->(end2:EndLabel)
WHERE NOT(end1 IS NULL AND end2 IS NULL)
RETURN *
顺便说一句,我觉得 end1 IS NOT NULL OR end2 IS NOT NULL
对我来说更好读
这是获取结果的另一种方法:
MATCH (start:StartLabel)-[:A]->(end:EndLabel)
RETURN start, NULL as middle, end
UNION
MATCH (start:StartLabel)-[:B|C]->(middle:MiddleLabel)-[:D]->(end:EndLabel)
RETURN start, middle, end
我有一个这样的密码查询:
MATCH (start:StartLabel)
OPTIONAL MATCH (start)-[:A]->(end1:EndLabel)
OPTIONAL MATCH (start)-[:B|C]->(middle:MiddleLabel)-[:D]->(end2:EndLabel)
WHERE NOT(end1 IS NULL AND end2 IS NULL)
RETURN *
在此图形模型中,有多种从 (start)
到达 (end)
的有效方法,但我想确保结果至少匹配一条可能的 OPTIONAL MATCH
路径。出于某种原因,我继续得到结果,其中 end1
和 end2
都是 NULL
与此 WHERE
子句。我是否遗漏了有关 Cypher 如何一起处理 OPTIONAL MATCH
和 WHERE
的信息?
我听说 WHERES
总是适用于最近的 (OPTIONAL )MATCH
,所以也许这会起作用?
MATCH (start:StartLabel)
OPTIONAL MATCH
(start)-[:A]->(end1:EndLabel),
(start)-[:B|C]->(middle:MiddleLabel)-[:D]->(end2:EndLabel)
WHERE NOT(end1 IS NULL AND end2 IS NULL)
RETURN *
顺便说一句,我觉得 end1 IS NOT NULL OR end2 IS NOT NULL
对我来说更好读
这是获取结果的另一种方法:
MATCH (start:StartLabel)-[:A]->(end:EndLabel)
RETURN start, NULL as middle, end
UNION
MATCH (start:StartLabel)-[:B|C]->(middle:MiddleLabel)-[:D]->(end:EndLabel)
RETURN start, middle, end