Добавьте вершины в График 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() метод.

Другие вопросы по тегам