2013-08-13 10 views
2

아래 그래프가 있습니다. 리그 (l1)는 으로 시작하고 레벨 r1과 NEXT 레벨은 그림과 같이 NEXT 관계를 사용하여 관련됩니다.연결된 목록에 대한 Neo4j 암호 쿼리

league-[:LEVEL]->r1-[:NEXT]->r2-[:NEXT]->r3-[:NEXT]->r4 

내가 찾고있는 것은 주어진 리그의 모든 레벨과 순서를 찾는 것입니다. 위의 그래프에서 예상 출력은 r1, r2, r3, r4입니다. 나는 아래의 쿼리를했지만 그것은 모든 경로를 반환합니다.

start l1=node(9) match l1-[:level]->(level) with level match p=level-[:next*]->(remainingLevels) return p; 

이 그래프를 만들기위한 지시자. 이것은 내가이 아래 쿼리 작업을 얻을 수 있었다 console.neo4j.org에 설치합니다 (아이디의 변경해야합니다)

CREATE (l1 {name: 'l1'}) return l1; 
CREATE (r1 {name: 'r1'}) return r1; 
START l1=node(9), r1=node(10) CREATE l1-[r:level]->r1; 
CREATE (r2 {name: 'r2'}) return r2; 
START r1=node(10), r2=node(11) CREATE r1-[r:next]->r2; 
CREATE (r3 {name: 'r3'}) return r3; 
START r2=node(11), r3=node(12) CREATE r2-[r:next]->r3; 
CREATE (r4 {name: 'r4'}) return r4; 
START r3=node(12), r4=node(13) CREATE r3-[r:next]->r4; 
+0

(노드 (P)). – Edward

+0

@Edward console.neo4j.org에서 노드와 릴레이션을 설정합니다. 쿼리가 제대로 작동하는지 확인했습니다. 단순화되거나 최적화 된 검색어를 찾을 수 있는지 확인하십시오. –

+0

해당 페이지에 "공유"버튼이 있어야합니다. 그 링크를 귀하의 질문에 포함시킬 수 있다면, 나는 그것을 체크 아웃 할 것입니다. – Edward

답변

4

나는 설정 데이터를 정리하고 답변 here 시도 출발 노드로부터 도달하기까지 소요 된 경로의 거리만큼. 수준에에 도착하는 muliple 방법이있다, 그래서 만약

참고이 가능한 모든 경로를 발견, 그것은 매우 잘 작동하지 않습니다. 즉, 그래프가 꽤 나무처럼 보이고 (사이클이 없음) 이것이 제대로 작동합니다.

는 2.0 쿼리는 WHERE 질의에 의존하기 때문에 그래프 (L1)에서 시작 노드를 얻기 위해 모든 인덱스를 활용합니다.

1

이미.

start l1=node(9) 
match l1-[:level]->(level) 
with level 
match p = level-[:next*]->(remainingLevels) 
with level, max(length(p)) as maxlen 
match p = level-[:next*]->(remainingLevels) 
where length(p)=maxlen 
return nodes(p); 

출력

+-----------------------------------------------------------------------------------+ 
==> | nodes(p)                   | 
==> +-----------------------------------------------------------------------------------+ 
==> | [Node[10]{name:"r1"},Node[11]{name:"r2"},Node[12]{name:"r3"},Node[13]{name:"r4"}] | 
==> +-----------------------------------------------------------------------------------+ 

모든 단순화 또는 최적화 환영합니다.

MATCH league-[r:level|next*]->(level) 
WHERE league.name?="l1" 
RETURN level, length(r) AS Dist, r 
ORDER BY length(r) 
쿼리는 리그 (L1)에서 시작하여 모든 걸쳐 추적

: 레벨 : 다음 경로와 정렬있는 노드를 반환

+0

이것은 1.8.2에서 작동하지만 console.neo4j.org에서 이것은 첫 번째 노드 "r1"을 두 번 돌려 주므로이 노드를 사용해야합니다. tail (노드 (p)). 왜 이런 행동의 차이가 있는지 모르겠습니다. –

+0

보고 싶은 콘솔 링크가 있습니까? –

+0

@MichaelHunger - 여기 console.neo4j 콘솔이 있습니다.org/r/gi6zz3 –

1

방법이 쿼리에 대한,

일치 P = league1 - [: 수준] -> (레벨) - [: 다음 *] -> endLevel

WHERE league1.name = 'L1'AND NOT (endLevel - [: 다음] ->())

RETURN 꼬리 그것은 당신이 우리와 함께 일할 수 있다는 console.neo4j.org에서 설정 뭔가를 수 있다면 유용 할 것이다

+0

LEVEL 및 NEXT를 소문자로 변환 한 후에도 아무 것도 반환하지 않습니다. –

+0

콘솔의 그래프에 정확하게 일치하도록 쿼리를 수정했습니다. Match p = league1 - [: level] -> (level) - [: next * ] -> endLevel 어디에서 league1.name? = 'l1'AND NOT (endLevel - [: next] ->()) 꼬리 (노드 (p)) –