Тинкерпроп Гремлин: порядок под тяжестью отношений - PullRequest
0 голосов
/ 21 июня 2019

Вот моя тестовая база данных:


    graph = TinkerGraph.open()
    g = graph.traversal()
    v1 = g.addV("person").property(id, 1).property("name", "1").next()
    v2 = g.addV("person").property(id, 2).property("name", "2").next()
    v3 = g.addV("person").property(id, 3).property("name", "3").next()
    v4 = g.addV("person").property(id, 4).property("name", "4").next()
    v5 = g.addV("person").property(id, 5).property("name", "5").next()
    v6 = g.addV("person").property(id, 6).property("name", "6").next()
    g.addE("knows").from(v1).to(v2).property(id, 10).property("weight", 0.4)
    g.addE("knows").from(v1).to(v2).property(id, 11).property("weight", 0.4)
    g.addE("knows").from(v1).to(v4).property(id, 12).property("weight", 0.2)
    g.addE("knows").from(v1).to(v6).property(id, 13).property("weight", 1)
    g.addE("knows").from(v2).to(v3).property(id, 14).property("weight", 0.4)
    g.addE("knows").from(v3).to(v5).property(id, 15).property("weight", 0.4)
    g.addE("knows").from(v4).to(v5).property(id, 16).property("weight", 0.4)
    g.addE("knows").from(v4).to(v5).property(id, 17).property("weight", 0.3)
    g.addE("knows").from(v6).to(v5).property(id, 18).property("weight", 0.4)
    g.addE("knows").from(v6).to(v5).property(id, 19).property("weight", 0.4)
    g.addE("knows").from(v6).to(v5).property(id, 20).property("weight", 0.2)

Я пытаюсь получить кратчайший путь (минимальная сумма веса) от одного человека к другому.

Вот мой текущий запрос:


    g.V(1).repeat(bothE("knows").bothV()).until(hasId(6)).path().as("path").map(unfold().coalesce(values("weight"), constant(0)).sum()).as("Cost").select("path", "Cost").limit(10);
    ==>[path:[v[1],e[13][1-knows->6],v[6]],Cost:1]
    ==>[path:[v[1],e[10][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.4]
    ==>[path:[v[1],e[11][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.4]
    ==>[path:[v[1],e[12][1-knows->4],v[1],e[13][1-knows->6],v[6]],Cost:1.2]
    ==>[path:[v[1],e[13][1-knows->6],v[1],e[13][1-knows->6],v[6]],Cost:2]
    ==>[path:[v[1],e[10][1-knows->2],v[1],e[10][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.8]
    ==>[path:[v[1],e[10][1-knows->2],v[1],e[11][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.8]
    ==>[path:[v[1],e[10][1-knows->2],v[1],e[12][1-knows->4],v[1],e[13][1-knows->6],v[6]],Cost:1.6]
    ==>[path:[v[1],e[10][1-knows->2],v[1],e[13][1-knows->6],v[1],e[13][1-knows->6],v[6]],Cost:2.4]
    ==>[path:[v[1],e[10][1-knows->2],v[2],e[10][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.8]

Я не нахожу, как сделать заказ по стоимости.Я пытаюсь с шагом order() и by("Cost"), но он не работает, он никогда не возвращает результат.Вот один из моих тестов, которые ничего не возвращают.

g.V(1).repeat(bothE("knows").bothV()).until(hasId(6)).path().as("path").map(unfold().coalesce(values("weight"), constant(0)).sum()).as("Cost").select("path").order().by(select("Cost")).limit(10);

1 Ответ

2 голосов
/ 21 июня 2019

Ваш запрос работает в бесконечном цикле.В первом запросе вам просто повезло, так как repeat() знал о шаге limit() и, таким образом, остановился после выброса 10 вершин.* * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * repeat() * без учета order().by() с учетом того, что *1003* больше не может сделать это, поскольку order().by() нужны все результаты, прежде чем он сможет что-либо заказать.1009 *
...