2016-10-09 3 views
0

Cypher query to find nodes that are not related to other node by property과 유사하지만 지금까지 저를 괴롭히기에 충분합니다. 그들은 언어의 요구 사항을 충족 이미 그것에 관계 (예를 들어, 일 또는 거부)를 가지고 있지 않은 경우사이퍼 쿼리를 사용하여 일부 관계가있는 노드를 찾으십시오.

Persons, Languages, and Tasks

사람은 작업을받을 수 있습니다.

작업은 서로 의존 할 수 있으며 0 이상 DEPENDS_ON 개의 rel 및 'root'작업 REQUIRES을 통해 언어를 '상속'할 수 있습니다.

& hellip;을 (를) 찾을 수있는 쿼리를 만들려고합니다.

  • p1 나는, 일 다움 아직
  • p2이 4
  • p3을받을 경우에도 약 t1 년대를 걱정하지 어떤

에 적합하지 않습니다 t2t4 자격이 나는 '유산'을 지나치고 지나간다고 생각하지 않는다. 예를 들어

, p2을 위해 :

MATCH (p:Person {name: 'p2'})-[:SPEAKS]->(lang) WITH p, collect(lang) AS langs MATCH (t:Task)-[:DEPENDS_ON*0]->(:Task)-[:REQUIRES]->(lang:Language) WHERE lang IN langs RETURN t

0 행

MATCH (p:Person {name: 'p2'})-[:SPEAKS]->(lang) RETURN lang

가져 두 언어를 발견, 그래서 난 확실히 collect(lang) as langs 내가 원하는 것을 (꽤?) .

제거 :DEPENDS_ON* 링크

MATCH (p:Person {name: 'p2'})-[:SPEAKS]->(lang) WITH p, collect(lang) AS langs MATCH (t:Task)-[:REQUIRES]->(lang:Language) WHERE lang in langs RETURN t

나에게 t1, t2t3를 가져옵니다.

어떻게 t4을받을 수 있습니까?

TIA!

답변

2

경로를 훨씬 더 유연하게 통과 할 수 있습니다. 경로의 다른 인스턴스가 별도의 언어를 통해 라우팅 할 수있는 경우에도 공유 언어 노드를 통해 사람에서 작업으로의 경로를 찾는 것은 모두 하나의 경로 패턴입니다. 그런 다음 0 이상의 가변 길이 경로를 사용하여이를 확장하여 주어진 작업에 의존하는 작업을 찾을 수 있습니다. 마지막으로, 작업이 무효 인 사용자 중 하나를 사용하는 사람에게 다시 관련된 경로를 필터링하십시오. 관계.

MATCH (p:Person) - [:SPEAKS] -> (:Language) <- [:REQUIRES] - (:Task) <- [:DEPENDS_ON*0..] - (t:Task) 
WHERE NOT (t) <- [:IS_DOING|:REJECTED] - (p) 
RETURN p, COLLECT(DISTINCT t) 
+0

좋은 점 - 추측해볼만한 그래프가 더 필요합니다. –

관련 문제