gremlin-python - невозможно добавить свойство края

У меня большие проблемы с добавлением свойств к краю с помощью оболочки gremlin_python.

Я могу создать край, вот так:

eid1='123'
eid2='456'
edge = g.V().has('eid', eid1).addE('transaction').to(g.V().has('entity_id',eid2)).next()

Но добавить свойства к краю не получится. Пример: код выполняется без ошибок, но на самом краю никаких изменений не происходит, поэтому, когда я вызываю g.E(edge).valueMap.toList(), он возвращает пустой список.

g.E(edge).property('foo','bar').iterate()    <-- I've also tried this without iterate.

Это также не сработает, если я создам узел и добавлю свойство в той же строке кода.

Тот же код - но выполняется в консоли gremlin - работает должным образом. т.е. после создания ребра и присвоения свойства:

gremlin> g.E(edge).valueMap().toList()
==>{foo=bar}

Любая помощь здесь будет принята с благодарностью.


Обновить

Мне не удалось заставить это работать, используя оболочку python для объекта обхода графа, вместо этого я запустил код через клиент, который работает, как ожидалось. Но это обходной путь, а не решение.

gremlin_client = client.Client('ws://localhost:8182/gremlin', 'g')

query = "g.V().has('eid', '123').addE('transaction').to(g.V().has('eid','456')).property('foo','bar').next()"
gremlin_client.submit(query).all().result()

person Ian    schedule 19.06.2019    source источник
comment
вы можете объяснить, что вы имеете в виду под словом «не выполняется»? вы получаете ошибку? или он просто выполняется, а в базе данных не происходит никаких изменений?   -  person stephen mallette    schedule 19.06.2019
comment
Привет, Стивен, последний, код работает без ошибок, но никаких изменений в базе данных не происходит.   -  person Ian    schedule 19.06.2019
comment
Может быть, правки проясняют это, спасибо   -  person Ian    schedule 19.06.2019
comment
хм - не могли бы вы попробовать g.E(edge.id()).property(...)?   -  person stephen mallette    schedule 19.06.2019
comment
К сожалению, не повезло. Использование ...edge.id... работает в консоли, но не работает так же, как описано в gremlin_python.   -  person Ian    schedule 19.06.2019


Ответы (2)


Я протестировал ваш сценарий на 3.4.3-SNAPSHOT и не вижу проблемы:

>>> g.addV().property('entity_id','123').iterate()
[['addV'], ['property', 'entity_id', '123'], ['none']]
>>> g.addV().property('entity_id','456').iterate()
[['addV'], ['property', 'entity_id', '456'], ['none']]
>>> e = g.V().has('entity_id','123').addE('transaction').to(__.V().has('entity_id','456')).next()
>>> g.E(e).property('foo','bar').iterate()
[['E', e[4][0-transaction->2]], ['property', 'foo', 'bar'], ['none']]
>>> g.E(e).valueMap().toList()
[{u'foo': u'bar'}]

Я отмечаю, что в вашем примере кода действительно есть синтаксическая ошибка - глядя на:

eid1='123'
eid2='456'
edge = g.V().has('eid', eid1).addE('transaction').to(g.V().has('entity_id',eid2)).next()

В частности, вы смешиваете «eid» и «entity_id» в качестве идентификаторов вершин. Предполагая, что «eid» неправильный, и он должен быть «entity_id», я мог видеть, как этот обход не удастся без обновления (поскольку начальная вершина никогда не найдена), а затем оставил вас в положении, в котором вы не могли обновить край, потому что он был никогда не создавал.

В ответ на комментарии ниже я также попробовал это, включив property() обновление с помощью TinkerGraph, и не испытал проблем:

>>> g.addV().property('entity_id','123').iterate()
[['addV'], ['property', 'entity_id', '123'], ['none']]
>>> g.V().toList()
[v[0]]
>>> g.addV().property('entity_id','456').iterate()
[['addV'], ['property', 'entity_id', '456'], ['none']]
>>> g.V().has('entity_id','123').addE('transaction').to(__.V().has('entity_id','456')).property('weight',0.1).property('time',1000000).iterate()
[['V'], ['has', 'entity_id', '123'], ['addE', 'transaction'], ['to', [['V'], ['has', 'entity_id', '456']]], ['property', 'weight', 0.1], ['property', 'time', 1000000], ['none']]
>>> g.E().valueMap().toList()
[{'time': 1000000, 'weight': 0.1}]

Я действительно не уверен, что могло быть не так.

person stephen mallette    schedule 20.06.2019
comment
У меня точно такая же проблема. И я могу подтвердить, что добавление края и затем установка свойства работают нормально. Но знаете ли вы, почему я не могу добавить свойство, когда добавляю край? Нравится g.V(V1).addE('label').to(V2).property('START',1566660000).property('STOP', 999999999999999999).next() - person Davide Icardi; 19.09.2019
comment
я не уверен, что могло быть не так. это такие основные операции. какую базу данных графов вы используете? - person stephen mallette; 19.09.2019
comment
Я использую базу данных TinkerGraph memory. Но я подозреваю, что проблема в python lib. Потому что использование консоли gremlin работает нормально. Я буду тестировать с AWS neptune, который является моей целевой базой данных. - person Davide Icardi; 19.09.2019
comment
Я пробовал использовать TinkerGraph и не вижу никаких проблем с использованием property(), однако я заметил, что вы получаете неприятную ошибку со значением свойства 999999999999999999 - определенно не тонким. это число выходит за рамки 32-битного int в Java. Ошибка отображается в журналах сервера более явно, чем на клиенте, что не так хорошо. вам нужно ввести его так долго, как statics.long(999999999999999999), и тогда он будет работать нормально. Не уверен, это ваша проблема или нет. - person stephen mallette; 19.09.2019

Я попал в такую ​​же ситуацию. Использование edgeid.id ['@ value'] ['RelationsId'] у меня сработало. g.E (edgeid.id ['@ value'] ['RelationshipId']). property ('foo', 'bar'). iterate ()

Когда мы просто используем g.E () в gremlin python, он работает, но использование edge для фильтрации краев не поддерживается так, как мы ожидали. g.E (edge) .toList () был пуст. Я подумал, что он не может искать края. Поэтому я напрямую использовал RelationsId, и это сработало.

person Shubham Saket    schedule 22.07.2021