Добавьте вершины в График TitanDB в Java
Примеры из учебных пособий или онлайн-документации часто используют оболочку Gremlin/Groovy для демонстрации API-интерфейсов TitanDB. Я работаю в простой (старой, но не очень старой) Java-8, и первое, что мне нужно реализовать, - это эффективный метод добавления вершин и ребер в граф.
Итак, чтобы getOrCreate вершина с идентификатором String, я сделал это:
private Vertex getOrCreate(TitanGraph g, String vertexId) {
Iterator<Vertex> vertices = g.vertices();
if (!vertices.hasNext()) { // empty graph?
Vertex v = g.addVertex("id", vertexId);
return v;
} else
while (vertices.hasNext()) {
Vertex nextVertex = vertices.next();
if (nextVertex.property("id").equals(vertexId)) {
return nextVertex;
} else {
Vertex v = g.addVertex("id", vertexId);
return v;
}
}
return null;
}
Это наиболее эффективный метод, предлагаемый API-интерфейсами TitanDB?
1 ответ
Прежде всего, больше нет реального разделения между Gremlin Java и Groovy. Вы можете написать Гремлин одинаково хорошо в обоих. Так что с этим, я бы сказал, просто используйте Gremlin для вашего getOrCreate
который сводится к базовому вкладышу:
gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1).tryNext().orElseGet{graph.addVertex(id, 1)}
==>v[1]
Приведенный выше код является синтаксисом Groovy, но Java почти такой же:
g.V(1).tryNext().orElseGet(() -> graph.addVertex(id, 1));
Единственная разница заключается в синтаксисе лямбда / замыкания. Обратите внимание, что в моем случае id
является зарезервированной собственностью Element
- это уникальный идентификатор. Вы могли бы рассмотреть другое имя для вашего "идентификатора", чем "id" - возможно, "uniqueId", в этом случае ваш getOrCreate
будет выглядеть так:
private Vertex getOrCreate(TitanGraph graph, String vertexId) {
GraphTraversalSource g = graph.traversal();
return g.V().has("uniqueId", vertexId).tryNext().orElseGet(() -> graph.addVertex("uniqueId", vertexId);
}
Я также рекомендовал бы обойти GraphTraversalSource
если вы можете - не нужно создавать это снова и снова с graph.traversal()
метод.