2017-09-06 7 views
1

에 따라 I 후속 사이퍼 쿼리가 : 지금 난Neo4j 사이퍼 및 쿼리 건설 조건

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

: 때때로

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 

내가 쿼리의 다음과 같은 부분이 필요하지 않습니다를 이 목적을 위해 다른 쿼리를 사용하는 새로운 메소드를 소개하려고합니다.하지만 이것을 묻는 것이 좋습니다.이를 달성하기위한 선호 된 접근 방식입니까, 아니면 Cypher에서 또 다른 방법이 있습니다. 예를 들어 몇 가지 새로운 부울 변수를 도입 할 수 있습니다. 그 값 나는 다음과 같은 정보를 반환하기 위해 조건을 추가 할 수있다. 이온 : OPTIONAL MATCH (ch)-[rcho:CONTAINS]->(cho:CharacteristicOption)

답변

3

다음 쿼리는 APOC를 사용하지 않고도 원하는대로 수행 할 수 있습니다. executeOptionalMatchOPTIONAL 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 

당신은 OPTIONAL MATCHWHERE이 실행되기 전에 어떤 중요한 작업을 수행합니다 있는지 확인하기 위해 쿼리의 PROFILE를 얻을 수 있습니다. 내 버전의 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 MATCHownerDecisionId = true 실행됩니다.

참고 : 사용중인 Neo4j의 버전에 따라 APOC 절차를 설치해야합니다. Version Compatibility Matrix을 살펴보십시오.

+1

고마워요! 나는 APOC를 시도 할 것이다. – alexanoid