Учитывая ваш самый последний комментарий к ответу Kfir, который включает ваш последний код, я думаю, что есть несколько проблем, которые нужно исправить с вашим подходом. Прежде всего обратите внимание, что addV()
не занимает длинный список меток и свойств. Я удивлен, что не сгенерировал ошибку для вас. addV()
просто принимает метку вершины в качестве аргумента, а затем вы используете property()
для предоставления связанных пар ключ / значение.
g.V().has('User', 'refId', '435').
fold().
coalesce(unfold(),
addV('User').
property('name', 'John Smith').property('refId', '435').property('firstName', 'John').
property('lastName', 'Smith').property('JobTitle', 'Chief Executive Officer')).as('user').
V().has('JobTitle', 'name', 'Advisor').
fold().
coalesce(unfold(), addV(label, 'JobTitle', 'name', 'Advisor')).as('jobtitle').
V().
addE('REGISTERED_AS').
from('user').
to('jobtitle')
Перед addE()
есть дополнительный V()
, который в основном, вызывайте addE()
для каждой вершины вашего графа, а не только для одной вершины, к которой вы хотите добавить ребро.
g.V().has('User', 'refId', '435').
fold().
coalesce(unfold(),
addV('User').
property('name', 'John Smith').property('refId', '435').property('firstName', 'John').
property('lastName', 'Smith').property('JobTitle', 'Chief Executive Officer')).as('user').
V().has('JobTitle', 'name', 'Advisor').
fold().
coalesce(unfold(), addV(label, 'JobTitle', 'name', 'Advisor')).as('jobtitle').
addE('REGISTERED_AS').
from('user').
to('jobtitle')
Итак, теперь синтаксис выглядит правильно, но есть проблема, и она проистекает из этого:
gremlin> g.V(1).as('x').fold().unfold().addE('self').from('x').to('x')
The provided traverser does not map to a value: v[1]->[SelectOneStep(last,x)]
Type ':help' or ':h' for help.
Display stack trace? [yN]
Информация о пути в обходе теряется после шага сокращения ( т.е. fold()
), поэтому вы не можете выбрать обратно к «х» после этого. Вам нужно немного реформировать свой обход, чтобы не требовать fold()
:
g.V().has('User', 'refId', '435').
fold().
coalesce(unfold(),
addV('User').
property('name', 'John Smith').property('refId', '435').property('firstName', 'John').
property('lastName', 'Smith').property('JobTitle', 'Chief Executive Officer')).as('user').
coalesce(V().has('JobTitle', 'name', 'Advisor'),
addV('JobTitle').property('name', 'Advisor')).as('jobtitle').
addE('REGISTERED_AS').
from('user').
to('jobtitle')
Это на самом деле означает просто использование coalesce()
напрямую без паттернов fold()
и unfold()
. Вам действительно нужен этот шаблон только в начале обхода, чтобы гарантировать, что traverser остается в потоке (т.е. если пользователь не существует fold()
создает пустой список, который становится новым traverser, и обход будет продолжаться) ,