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

时间:2017-09-06 15:31:03

标签: 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

有时我不需要以下部分查询:

OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)

现在我将为此目的引入一个具有不同查询的新方法,但是想问一下 - 为了实现这一目标是一种首选方法还是在Cypher中有另一种方法...例如我可以引入一些新的布尔变量,并根据其值,我可以添加一个条件,以便返回(或不)以下信息:OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)

2 个答案:

答案 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