Neo4j Cypher 和基于条件的查询构建

ale*_*oid 2 neo4j cypher

我有以下 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)

cyb*_*sam 5

以下查询可能不需要使用 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 MATCHWHERE执行之前是否做了任何重要的工作。我在我的 Neo4j 版本中获得的配置文件显示WHERE过滤是在OPTIONAL MATCH执行任何实际工作之前完成的。

  • 更明显和有效的解决方案:) 真的很有用,谢谢! (2认同)