Gremlin Tinkerpop возвращает объект Path, как вы получаете доступ к отдельным вершинам - PullRequest
1 голос
/ 14 апреля 2020

Я вижу, что об этом спрашивали несколько раз, но я не вижу ответа, который мне подходит.

Я использую его в приложении Java и хочу вернуть ArrayList из либо вершины, либо просто строки, содержащие вершину iD. Я должен использовать шаг Path (), так как мне нужно, чтобы вершины возвращались в правильном порядке, однако я получаю просто список с двумя объектами, который выглядит как исходная вершина как объект и весь путь как объект, я могу не манипулировать данными или использовать их?

Мой обход:

List<Object> routeList;

routeList = g.V(sourceID).shortestPath().with(ShortestPath.edges, Direction.OUT)
                .with(ShortestPath.distance, "weight").with(ShortestPath.target, hasId(targetId))
                .with(ShortestPath.includeEdges, false).path().unfold().toList();

Вывод списка:

v[L00-041]
path[v[L00-041], v[L00-042], ...etc.... v[L00-043], v[L00-031]]

Мне действительно нужно возвращать путь в удобном для использования формате. Я уверен, что кто-то был в этом положении раньше и может мне помочь. Спасибо.

1 Ответ

2 голосов
/ 14 апреля 2020

В общем случае для запросов path () Gremlin вернет вам объект Path, через который вы можете выполнить итерацию. Вот пример из консоли Gremlin.

gremlin> p = g.V(1).out().limit(1).path().next()
==>v[1]
==>v[135]
gremlin> p.class
==>class org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath
gremlin> p[1]
==>v[135]
gremlin> p[0]
==>v[1]       
gremlin> p.size()
==>2
gremlin> for (e in p) {println(e)}
v[1]
v[135]    

Соответствующий JavaDo c находится здесь:

https://tinkerpop.apache.org/javadocs/current/full/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.html

https://tinkerpop.apache.org/javadocs/current/full/org/apache/tinkerpop/gremlin/process/traversal/Path.html

Используя Java, вы можете сделать что-то вроде этого.

List<Path> p = g.V("1").out().limit(1).path().toList();
p.get(0).forEach(e -> System.out.println(e));

Однако при работе с шагом shorttestPath () возвращаемый результат является ReferencePath, который содержит начальную вершину и путь, который был шел. Вы можете получить к нему доступ из консоли следующим образом, а также сделать аналогичный приведенному выше примеру из Java. Как и Path, ReferencePath является итеративным.

gremlin> routeList.class
==>class org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath
gremlin> routeList[0].class
==>class org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex
gremlin> routeList[1].class
==>class org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath
gremlin> for (v in routeList[1]) {println v}
v[3]
v[8]
v[44]

Вот JavaDo c для ReferencePath https://tinkerpop.apache.org/javadocs/current/full/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.html

...