0

Gremlin/TinkerPop 쿼리 언어를 사용하면 방향성이있는 비순환 그래프의 위상 순서를 계산할 수 있습니까?Gremlin의 위상 별 정렬

예를 들어, I는 다음과 같은 순서, 위상 중 하나를 획득하려는 다음 에지

a -> b, a -> d, b -> c, c -> d, e -> c 

와 그래프 주어진 : a, b, e, c, d 또는 a, e, b, c, d 또는 e, a, b, c, d한다.

g = TinkerGraph.open().traversal() 
g.addV(id, "a").as("a"). 
    addV(id, "b").as("b"). 
    addV(id, "c").as("c"). 
    addV(id, "d").as("d"). 
    addV(id, "e").as("e"). 
    addE("link").from("a").to("b"). 
    addE("link").from("a").to("d"). 
    addE("link").from("b").to("c"). 
    addE("link").from("c").to("d"). 
    addE("link").from("e").to("c").iterate() 

을 그리고 이것은 그렘린에 Kahn's algorithm를 구현됩니다 :

답변

1

좋아, 먼저 샘플 그래프를 만들 수

gremlin> g.V().not(__.inE()).store("x"). 
      repeat(outE().store("e").inV().not(inE().where(without("e"))).store("x")). 
     cap("x") 
==>[v[a],v[b],v[e],v[c],v[d]] 
+0

이 예를 들어 그래프'주어진 올바른 위상 순서를 제공하지 않습니다 -> b, b -> c, c -> d, a -> d' 질의는'a, d, b, c'를 반환하지만 정답은'a, b, c, d '이다. 부수적으로 타임 아웃을 발생시키지 않고이 쿼리를 실행하기 위해서 나는 거대한 DAG를 가지고 있기 때문에'repeat (...) '안에'dedup()'을 옮겨야했다. 나는 그것이 의미 론적으로 동등하다고 생각한다. – Federico

+0

업데이트 됨. 샘플 그래프와 예상 결과는 많은 도움이되었습니다. –

+0

고마워요! 그래프에 루프가 있어도 종료됩니다. 완벽합니다. – Federico