Gremlin Java Использование DefaultGraphTraversal бросает вершину, уже существующую - PullRequest
1 голос
/ 03 марта 2020

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

Это работает:

GraphTraversalSource graph = TinkerGraph.open().traversal();
graph.addV().property(T.id, "1").next();
graph.V("1").fold().coalesce(__.unfold(),__.addV().property(T.id, "1")).next();

Я видел graph.V () на самом деле создает DefaultGraphTraversal с предоставленным GraphTraversalSource, поэтому я попытался написать его по-другому:

GraphTraversalSource graph = TinkerGraph.open().traversal();
graph.addV().property(T.id, "1").next();
new DefaultGraphTraversal(graph).V("1").fold().coalesce(__.unfold(),__.addV().property(T.id, "1")).next();

Но возникло исключение :

java.lang.IllegalArgumentException: Vertex with id already exists: 1

Интересно, почему это не то же самое, что и первый способ? Кажется, DefaultGraphTraversal не должен использоваться напрямую?

1 Ответ

2 голосов
/ 03 марта 2020

Хотя класс DefaultGraphTraversal равен public, я не думаю, что он предназначен для непосредственного использования пользователями. Однако он может быть полезен для поставщиков графов, поэтому он не защищен областью действия. Придерживайтесь написания Gremlin для взаимодействия с вашим графиком, поскольку это будет самый переносимый способ , в котором вы можете создавать свои приложения. Я также хотел бы придерживаться более распространенных соглашений об именах вещей:

Graph graph = TinkerGraph.open();
GraphTraversalSource g = graph.traversal();
g.addV().property(T.id, "1").next();
g.V("1").fold().coalesce(__.unfold(),__.addV().property(T.id, "1")).next();

Это стало обычным делом для однострочного GraphTraversalSource creation:

GraphTraversalSource g = TinkerGraph.open().traversal(); 

, но дело в том, что " график "для Graph и" g "для GraphTraversalSource.

Почему прямое использование DefaultGraphTraversal приводит к ошибке:

gremlin> g = TinkerGraph.open().traversal();
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV().property(T.id, "1").next();
==>v[1]
gremlin> new DefaultGraphTraversal(g).V("1")
gremlin> new DefaultGraphTraversal(g).V("1").steps[0].isStartStep()
==>false
gremlin> g.V("1").steps[0].isStartStep()
==>true

Разница в том, что DefaultGraphTraversal вызов V() отличается от GraphTraversalSource позвоните по номеру V(). Первый - это середина обхода V(), а второй - стартовый шаг. Всегда используйте GraphTraversalSource и "g", чтобы начать писать свой Gremlin.

...