2017-09-06 40 views
1

我有以下的Cypher查询:Neo4j的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..for例如另一种方式,我可以介绍一些新的布尔变量和基于它的价值我可以添加一个条件以返回(或不)以下信息离子:OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)

回答

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获取的个人资料显示,OPTIONAL MATCH做任何实际工作之前,WHERE过滤完成。

+1

谢谢,我喜欢这种方法,因为我现在不需要使用APOC基础架构。 – alexanoid

+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

+1

谢谢!我会尝试APOC。 – alexanoid