我有以下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
有时我不需要以下部分查询:
OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)
现在我将为此目的引入一个具有不同查询的新方法,但是想问一下 - 为了实现这一目标是一种首选方法还是在Cypher中有另一种方法...例如我可以引入一些新的布尔变量,并根据其值,我可以添加一个条件,以便返回(或不)以下信息:OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)
答案 0 :(得分:3)
以下查询可以执行您想要的操作而无需使用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
您可以获取查询的PROFILE,以查看OPTIONAL MATCH
在执行WHERE
之前是否执行了任何重要工作。我在neo4j版本中获得的个人资料显示WHERE
过滤是在OPTIONAL MATCH
完成任何实际工作之前完成的。
答案 1 :(得分:1)
尝试installing APOC程序并使用apoc.when
。
考虑以下参数:
:params {ownerDecisionId:10, name:'Jon',executeOptionalMatch:true}
您可以运行如下查询:
MATCH (d:Decision)<-[:DEFINED_BY]-(ch:Characteristic)
WHERE d.id = {ownerDecisionId} and ch.lowerName = LOWER({name})
CALL apoc.when({executeOptionalMatch}, 'OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption) RETURN rcho, cho', '', {ch:ch}) YIELD value
RETURN ch, value.rcho, value.cho
OPTIONAL MATCH
仅在ownerDecisionId = true
时执行。
注意:请记住根据您使用的Neo4j版本安装APOC程序。请查看Version Compatibility Matrix。