Гремлин объединяет два обхода

#java #gremlin #tinkerpop #graphdb

Вопрос:

У меня есть 2 обхода: 1, чтобы найти вершину по метке, и еще один, чтобы найти ребра по метке, и я пытаюсь объединить их, т. Е. Получить все ребра с меткой для вершин с меткой vertexlabel.

обход вершин:

 graph.traversal().V().hasLabel("vertexLabel")
 

функция обхода ребер (должна быть другой функцией):

 private GraphTraversal<Vertex, Edge> getEdges() {
    return __.inE("edgeLabel");
}
 

Я попробовал следующее, но это не сработало

 graph.traversal().V().hasLabel("vertexLabel").and(getEdges())
 

Комментарии:

1. Мне любопытно, почему вы хотите ввести обходы в запрос, а не просто параметризовать сам запрос? Ваш пример, возможно, просто простой случай чего-то более сложного, что вы хотите построить?

Ответ №1:

Вы можете использовать and или filter (в зависимости от конкретной Traversal местности, которую вы пересекаете)

 TinkerGraph g = TinkerGraph.open();

/*
         u:A
<1:A> ---------- <2:B>
  |                |
  | x:B            | v:B
  |                |
<4:B> ---------- <3:A>
         w:A
*/

Vertex v1 = g.addVertex(T.label, "A", T.id, 1);
Vertex v2 = g.addVertex(T.label, "B", T.id, 2);
Vertex v3 = g.addVertex(T.label, "A", T.id, 3);
Vertex v4 = g.addVertex(T.label, "B", T.id, 4);

v1.addEdge("A", v2, T.id, "u");
v2.addEdge("B", v3, T.id, "v");
v3.addEdge("A", v4, T.id, "w");
v4.addEdge("B", v1, T.id, "x");

// predefined traversal from somewhere
Traversal<Vertex, Vertex> vertexFilter = __.hasLabel("A");
Traversal<Vertex, Vertex> edgeFilter = __.hasLabel("B");
Traversal<Vertex, Edge> vertex2edges = __.bothE().filter(edgeFilter);
Traversal<Edge, Vertex> edge2vertex = __.bothV().filter(vertexFilter);

System.out.println("Get edges matching filter with any vertex matching filter:");
g.traversal().E().filter(edgeFilter).and(edge2vertex).toList()
        .forEach(e -> System.out.printf(" - %s%n", e.id()));

System.out.println("Get vertex matching filter with any edge matching filter:");
g.traversal().V().filter(vertexFilter).and(vertex2edges).toList()
        .forEach(v -> System.out.printf(" - %s%n", v.id()));
 

с выходом

 Get edges matching filter with any vertex matching filter:
 - v
 - x
Get vertex matching filter with any edge matching filter:
 - 1
 - 3
 

Комментарии:

1. спасибо, но это не ответ на вопрос. необходимо объединить 2 обхода, поэтому в вашем случае извлеките файл .bothE(«edgeLabel») в другую функцию

2. О, извините меня, тогда просто поместите обход внутри комбинатора ( filter , and , map ,…). Я обновил ответ.