2013-03-07 4 views
2

시작 노드에서 특정 깊이까지 내 가중 그래프를 트래버스하고 순회 노드와 누적 가중치를 인쇄하고 싶습니다.Neo4j - 가장 짧은 경로와 순회 비용을 찾기 위해 Gremlin을 사용합니다.

예를 들면, A-1-B-2-C-1-D, A-1-B-1-F- -G 깊이 3 노드 A를 시작하면 다음과 반환해야합니다 : A ~, B, F, G, 비용 :

(3) 나는 다음과 같은 코드를 사용하여 일부 진전이 있었다 그러나이 경로의 무게를 계산하지 않습니다

x=g.v(36);x.out('BELONGS').out('RELATED').in('BELONGS').loop(3){it.loops<10}{true}.paths{it.name} 

경로의 비용 및 순회 목록을 계산하려면 어떻게해야합니까? 사전에

감사합니다 ...

답변

0

Gremlin의 전면을 너무 많이 수정하지 않고 경로 표현식의 끝에서부터 계산을 시도했습니다. 어쩌면이이 접근 할 수있는 더 좋은 방법이지만, 여기에 내가 장난감 그래프를 사용하여 한 내용은 다음과 같습니다 가장자리가 경로에 나타나도록

gremlin> g = TinkerGraphFactory.createTinkerGraph() 
==>tinkergraph[vertices:6 edges:6] 
gremlin> g.v(1).outE.inV.loop(2){it.loops<3}{true}.path 
==>[v[1], e[7][1-knows->2], v[2]] 
==>[v[1], e[8][1-knows->4], v[4]] 
==>[v[1], e[9][1-created->3], v[3]] 
==>[v[1], e[8][1-knows->4], v[4], e[10][4-created->5], v[5]] 
==>[v[1], e[8][1-knows->4], v[4], e[11][4-created->3], v[3]] 

는 그래서 outE.inV의 포함을 확인합니다. 그럼 난 가장자리에서 무게를 얻기 위해 경로에 두 번째 폐쇄을 추가

gremlin> g.v(1).outE.inV.loop(2){it.loops<3}{true}.path{it.name}{it.weight} 
==>[marko, 0.5, vadas] 
==>[marko, 1.0, josh] 
==>[marko, 0.4, lop] 
==>[marko, 1.0, josh, 1.0, ripple] 
==>[marko, 1.0, josh, 0.4, lop] 

를 그 다음은 요약 무게로 그 출력을 조작 할 그루비 JDK 단지 무리입니다 : 그래서

gremlin> g.v(1).outE.inV.loop(2){it.loops<3}{true}.path{it.name}{it.weight}.transform{it.toList().split{i->"${i}".isNumber()}}.collect{[it[0].sum(),it[1]]} 
==>[0.5, [marko, vadas]] 
==>[1.0, [marko, josh]] 
==>[0.4, [marko, lop]] 
==>[2.0, [marko, josh, ripple]] 
==>[1.4000000059604645, [marko, josh, lop]] 

, 나는 (Peter가 제안한) 변형을 집어 넣고, 가중치 인 것들과 이름 인 것들로 목록을 나눕니다. (그냥 "isNumber"라는 값을 검사함으로써 ... 다른 접근법이 필요합니다) 그리고 나서 저는 그 위에 map 함수를 실행하여 가중치 모음을 sum()하고 이름 모음을 리턴하십시오.

+0

좋아요! 그것은 작동합니다! .. 대단히 감사합니다. – Hako

관련 문제