#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
,…). Я обновил ответ.