2013-05-21 2 views
1

내가 사이퍼 새로운 오전, 나는 다음과 같은 경우 Neo4j 사이퍼 가능 여부를 알고 싶습니다 :Neo4j 사이퍼 버스 노선 선택

bus route example

을 나는 버스에서주의해야한다 무엇을 조회 할 때 역 4 국 (1), 출력 (교체 이상의 수로 구성되는) 같아야

  1. 도보 1 -> 1 호선 -> 역 - 3> 경로 3 -> 4 국
  2. 역 1 - > 노선 2 -> 역 3 -> 3 호선 -> 4 국

하지만 모든 가능한 조합 :

  1. 역 1 -> 1 호선 -> 역 2 -> 1 호선 -> 역 3 -> 3 호선 - > 스테이션 4
  2. 스테이션 1 -> 스테이션 2 -> 라우트 2 -> 스테이션 3 -> 라우트 3 -> 스테이션 4
  3. 스테이션 1 -> 라우트 2 -> 스테이션 2 -> 라우트 1 - > 역 3 -> 경로 3 -> 역 4
  4. 역 1 -> 경로 2 -> 역 2 -> 경로 2 -> 역 3 -> 경로 3 -> 역 4

감사!

답변

3

조건식 없이는 어렵습니다 (CASE/WHEN은 2.0에 있음). 이것은 노력의 몇 분 안에 얻은 것만 큼 가까운 것입니다. 결과 관계 컬렉션에서 시작 노드를 제거해야합니다. 당신의 노력

start st1=node:node_auto_index(name="station1"), st4=node:node_auto_index(name="station4") 
match p=st1-[r*]->st4 
with reduce(acc=[], route in rels(p): 
    case 
    when length(acc) > 0 and last(extract(a in acc: a.name)) = route.name then acc 
    else acc + route 
    end) as reducedRoutes 
return reducedRoutes, length(reducedRoutes) as len 
order by len; 

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

+0

감사합니다! 너 나 많이 도와 줬어! 그것은 인터넷 에서이 답변을 얻는 것이 어렵다고 보인다. –

+0

이것은 유효한 해결책이지만, http://gist.neo4j.org/?8748091과 같은 큰 그래프의 경우 일치 항목 [* r1..10] 또는 좋은 숫자가 필요합니다. – Neoecos