2017-09-06 37 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