Добавьте край, если он не существует, используя гремлин В Python

прямо сейчас я пытаюсь использовать python для реализации некоторой логики гремлина для neptunedb of aws. Я хочу проверить, существует ли одно ребро или нет, если существует, игнорировать, в противном случае добавить ребро.

для консоли Gremlin мы можем сделать это так:

g.V().has('people','name', 'somebody').as('v').V().has('software','name','ripple').coalesce(__.inE('Created').where(outV().as('v')), addE('created').from('v').property('weight',0.5))

но я как бы потерял, как преобразовать это в python. Кажется, python не может распознать как ('v')? любые намеки? или где я могу найти справочную документацию для Gremlin Python.


person Hongli Bu    schedule 01.10.2019    source источник
comment
Я упомянул: stackoverflow.com/ вопросы/52447308/   -  person Hongli Bu    schedule 02.10.2019


Ответы (2)


Из документации TinkerPop Gremlin:

Термин as является зарезервированным словом в Python, и поэтому в Gremlin должен упоминаться с помощью as_().

То же самое и с from. Просто замените as на as_ и from на from_, и все должно работать.

person Rob Streeting    schedule 02.10.2019
comment
Кроме того, g.V().has('people','name', 'somebody') нужно заменить на g.V().hasLabel(people).has('name', 'somebody'), верно? - person Hongli Bu; 02.10.2019
comment
Во-первых, если я хочу использовать id, должен ли я использовать T? нравится g.V().hasLabel(people).has(T.id, 'somebody') - person Hongli Bu; 02.10.2019
comment
Для вашего первого комментария в этом нет необходимости - has() примет метку в качестве первого аргумента: has(label, key, value): удалить обходчик, если его элемент не имеет указанной метки и не предоставил свойство ключ/значение .. Я думаю, вам может понадобиться hasIds() для проверки идентификатора, внимательно изучите документы для has() tinkerpop.apache.org/docs/current/reference/#has-step - person Rob Streeting; 02.10.2019
comment
1. Являются ли эти два запроса одним и тем же? Если да, то есть ли разница в производительности? 2. Собственно хочу спросить, как проверить существование вершины, если я сбрасываю вершины через csv с заголовком "~id, ~label". Могу ли я проверить это как g.V().has('people', id, 'somebody') или g.V().has('people',T.id, 'somebody') или g.V().has('people','id', 'somebody')? На самом деле, я немного запутался с id в neptunedb. - person Hongli Bu; 02.10.2019

Просто чтобы сказать это немного яснее, для python вам нужно сделать следующее:

g.V().has('people','name', 'somebody').\
    as_('v').V().has('software','name','ripple').coalesce(
    __.inE('Created').where(__.outV().as_('v')), 
    __.addE('created').from_('v').\
    property('weight',0.5)).iterate()

Последний iterate() в конце важен, так как вам нужно предоставить терминальный шаг при работе на питоне по сравнению с консолью гремлина. Вы также можете использовать другие терминальные шаги, такие как next(), но без какого-либо конечного шага ребро не будет создано (по крайней мере, в Neptune).

person cts    schedule 17.03.2020