我有以下 Cypher 查询:
MATCH (d:Decision)<-[:DEFINED_BY]-(ch:Characteristic)
WHERE d.id = {ownerDecisionId} and ch.lowerName = LOWER({name})
OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)
RETURN ch, rcho, cho
Run Code Online (Sandbox Code Playgroud)
有时我不需要查询的以下部分:
OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)
Run Code Online (Sandbox Code Playgroud)
现在,我将为此目的引入一种具有不同查询的新方法,但想问一下 - 这是实现这一目标的首选方法还是 Cypher 中的另一种方法..例如,我可以引入一些新方法布尔变量并根据其值,我可以添加一个条件以返回(或不返回)以下信息: OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)
以下查询可能不需要使用 APOC 就可以执行您想要的操作。它假定这executeOptionalMatch是一个布尔参数,指示是否OPTIONAL MATCH应该执行。
MATCH (d:Decision)<-[:DEFINED_BY]-(ch:Characteristic)
WHERE d.id = {ownerDecisionId} and ch.lowerName = LOWER({name})
OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)
WHERE {executeOptionalMatch}
RETURN ch, rcho, cho
Run Code Online (Sandbox Code Playgroud)
您可以获取查询的PROFILE,以查看OPTIONAL MATCH在WHERE执行之前是否做了任何重要的工作。我在我的 Neo4j 版本中获得的配置文件显示WHERE过滤是在OPTIONAL MATCH执行任何实际工作之前完成的。