Запрос Gremlin не работает - 2 x вершины, если не существует, и добавление ребра - PullRequest
0 голосов
/ 20 марта 2020

Я использую гремлин и получаю утверждение ниже. Я хочу:

  • создать вершину, если она не существует
  • создать другую вершину, если она не существует
  • создать ребро между вершинами

Край не создается. Я бы очень признателен за помощь с логикой / подходом здесь.

    g.V().has('User','refId','435').
        fold().coalesce(unfold(),addV(label, 'User').
    property('name','John Smith').property('refId','435'))
        .as('user').
        V().has('JobTitle','name','Advisor').
        fold().coalesce(unfold(),addV(label,'JobTitle').
property('name','Advisor'))
.as('jobtitle').
    addE('REGISTERED_AS').from('user').to('jobtitle')

Ответы [ 2 ]

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

Учитывая ваш самый последний комментарий к ответу 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, и обход будет продолжаться) ,

0 голосов
/ 20 марта 2020

Код вопроса является частичным. Некоторое выравнивание поможет.

Тем не менее, я думаю, что ваша проблема в as('jobtitle'), который находится внутри оператора coalesce. То есть, если вершина существует, мы не доходим до второго обхода, и оператор as не выполняется. То же самое для as('user').

. Чтобы решить, просто переместите операторы as за пределы coalesce.

...