gremlin создает край при соблюдении ограничения множественности, если нарушено, отбросьте существующий край, затем создайте еще, просто создайте его

Я довольно долго пытаюсь решить свою проблему, которая похожа на

У меня есть график, в котором определены ограничения множественности. Когда создается новое ребро, либо может быть создано новое ребро, либо оно может нарушать ограничение множественности из-за изменения данных.

Теперь, когда данные изменились, мне нужно удалить / отбросить существующий край и создать новый. Это моя проблема. Я не могу бросить и создать край за один раз.

То, что я пытался, это то, что я отправляю запрос на сервер gremlin через модуль node-gremlin для nodejs. Отношение, которое я пытаюсь создать, - [продавец] -1 - (продает) - * -> [продукт]. В данном сценарии только 1 торговец может продать товар. когда какой-то другой торговец начинает продавать товар. Мне нужно обновить его, чтобы отразить новые отношения между ними. Может случиться так, что раньше его никто не продавал, поэтому нужно создать только новое преимущество. наконец, созданное ребро возвращается.

29 Jun 13:41:04 - [Error: An edge with the given label already exists on the in-vertex and the label [sells] is in-unique (Error 597)]
29 Jun
 13:41:04 - { text:
'g.V().has(sIdKey,sIdVal).inE(edgeLabel).drop();graph.tx().commit();g.V().has(fIdKey,fIdVal).outE(edgeLabel).inV().has(sIdKey,sIdVal).tryNext().orElseGet{g.V().has(fIdKey,fIdVal).next().addEdge(edgeLabel,g.V().has(sIdKey,sIdVal).next());};',
     params:
       { fIdKey: 'merchant_id',
         fIdVal: 20230,
         sIdKey: 'product_id',
         sIdVal: 184504,
         edgeLabel: 'sells' } }

Поток, которого я пытаюсь достичь, таков

Найдите, присутствует ли существующее ребро -> удалите существующее ребро -> зафиксируйте команду удаления ребра -> создайте новое ребро -> зафиксируйте новое ребро.

В приведенном выше запросе я не написал оператор фиксации для добавления ребер, потому что я совершаю массовое добавление ребер.

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


person palash kulshreshtha    schedule 29.06.2016    source источник


Ответы (1)


Перед фиксацией транзакции вам необходимо iterate() выполнить операцию сброса.

g.V().has(sIdKey,sIdVal).inE(edgeLabel).drop().iterate(); graph.tx().commit();

Это распространенный камень преткновения, который уже обсуждался ранее: Gremlin drop () не работает через java api

person Jason Plurad    schedule 29.06.2016