2012-09-22 2 views
3

각 노드가 Java 클래스를 나타내고 각 인스턴스에 namespace라는 속성이있는 그래프가 있습니다. 시작 노드와 최종 노드가 네임 스페이스를 공유하지만 모든 중간체가 해당 네임 스페이스를 공유하지 않는 패턴과 일치 시키려합니다. theres 3 개의 종류 (종류 A -> 종류 B -> 종류 C) i가있는 경우에 :조건이 참일 때 neo4j/cypher 쿼리를 중지합니다.

START inside1 = node(*) 
match inside1 -[:USES]-> outside1 -[:USES] -> inside2 
where inside1.namespace <> outside1.namespace 
    and inside2.namespace = inside1.namespace 
return inside1.name, outside1.name, inside2.name 

이것은 잘 작동하는 것을 보인다. 나는 그것을 확장했을 때, 나는 시도 :

START inside1 = node(*) 
match inside1 -[:USES]-> outside1 -[:USES*] -> inside2 
where inside1.namespace <> outside1.namespace 
    and outside1.namespace <> inside1.namespace 
    and inside2.namespace = inside1.namespace 
return inside1.name, outside1.name, inside2.name 

문제는 내가 중간 노드가 inside1과 같은 네임 스페이스를 공유하는 경로를 싶지 않는 것입니다. 그래서 내 질문은, 어쨌든 내가 말할 수있는 "네가 네임 스페이스 whos 네임 스페이스 inside1.namespace 같음 때"중지 할 수 있습니까?

감사합니다.

답변

3

가장 간결한 부분인지 잘 모르겠지만 원하는대로 생각하십니까? 먼저 쿼리를 사용하여 일반적인 경우를 얻은 다음 with과 함께 가장 좁은 match으로 제한합니다.

START inside1 = node(*) 
MATCH inside1-[:USES*]->outside1-[:USES]->inside2 
WHERE inside1.ns <> outside1.ns 
    AND inside2.ns = inside1.ns 
    WITH inside1, inside2, outside1 
MATCH inside1-[:USES]->outside2 
WHERE inside1.ns <> outside2.ns 
RETURN inside1, outside1, inside2 

http://console.neo4j.org/r/m8iqo5

+0

매우 깔끔한 웨스 인상적! –

+0

@PeterNeubauer 확인해 주셔서 감사합니다 - 그가 찾고있는 것이기를 바랍니다. :) –

관련 문제