2017-09-05 5 views
1

다음과 같은 문제점이 있습니다 : 유형 A의 경로 노드를 선택하고 싶습니다. 그러나 모든 경로는 원하지 않지만 특정 특성을 가진 경로 노드 만 원하지 않습니다. 문제는 데이터 모델에서 이러한 속성이 AD 유형의 별도 노드에 저장된다는 것입니다. 시작과 끝점에 대해서는 모든 것이 잘 동작합니다. 그리고 저는이 쿼리가 여기에서 완벽하게 잘 작동하기 때문에 일반 구조도 연구했다고 생각합니다.링크 된 노드 정보를 기반으로 경로를 선택하십시오.

MATCH (n:A)-->(ad:AD) WHERE ad.name='AD0' 
WITH n AS start 
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' 
WITH n AS end, start 
MATCH p = (start) -[:L*0..10]-> (end) 
WHERE ALL (x in nodes(p) [1..-1] WHERE ((x.name STARTS WITH 'ad1' OR x.name STARTS WITH 'ad2'))) 
return p 

여기서 문제는 우리의 최종 모델에서 가능 퍼가기되지 않습니다 A 형의 노드에서 중간 노드의 속성을 얻을 것이다. 테스트를 위해 A에 일반적으로 AD에 저장된 정보가 들어있는 속성을 추가했습니다.

결과에는 유형 AD 및 AD의 노드에 연결된 유형 A의 노드 만 포함되어야합니다. 이름은 AD0 ... AD3이어야하지만 AD 노드에 연결된 유형 A의 노드는 AD.name = AD4 '를 예로들 수 있습니다. 이 경우 다음 쿼리를 시도했지만 AD 노드 이름이 AD0 또는 AD3 인 노드 AD에 연결된 노드 A를 포함하는 경로 만 반환합니다.

MATCH (n:A)-->(ad:AD WHERE ad.name='AD0' 
WITH n AS start 
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' 
WITH n AS end, start 
MATCH (n:AD) WITH n AS ad, end, start //somehow needed otherwise I cannot use AD in the where clause 
MATCH p = (start) -[:L*0..]-> (end) 
WHERE ALL (
    x in nodes(p) [1..-1] WHERE (
     ((x)-->(ad:AD)) 
     AND 
     (ad.name ='AD1' OR ad.name='AD2') 
    ) 
) 
return p 

어떤 생각

왜 AD.name = AD1 또는 AD2와 형 AD의 노드에 연결 A 형의 노드를 포함하는 경로는 반환되지 않습니다?

+0

첫 번째 작업 : 'MATCH (n : AD) WITH n AS 광고, 싱크, 소스'줄에서 다음 컨텍스트로 '시작'및 '끝'을 전달하지 않습니다. . 이 줄을 '광고, 싱크, 소스, 시작, 종료'와 함께 'MATCH (n : AD)'로 변경하고 다시 시도해야한다고 생각합니다. –

+0

미안하지만, 믹스 업이 있었고, 싱크 소스가 지금 시작일뿐입니다. 위의 코드를 수정했습니다. – birnenpfluecker

답변

0

이 문제를 해결할 수있었습니다. 더 좋은 방법이 있는지 전혀 모르겠지만 중간 노드를 별도의 목록에 넣어야합니다. 그렇지 않으면 WHERE 절의 어디에서 사용할 수 없게됩니다.

MATCH (n:A)-->(ad:AD WHERE ad.name='AD0' 
WITH n AS start 
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' 
WITH n AS end, start 
MATCH (n:A)-->(ad:AD) WHERE (ad.name IN ['AD1', 'AD2']) 
WITH collect(n) AS intermediates, sinks, sources 
MATCH p = (start) -[:L*0..]-> (end) 
WHERE ALL (
    x IN nodes(p) [1..-1] WHERE (
     x IN intermediates 
    ) 
) 
return p