Условно установить значение свойства на ребре при добавлении вершины [GREMLIN API] - PullRequest
1 голос
/ 31 октября 2019

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

Пока что это то, что я придумал: - это работает без ошибок, но яне могу получить никаких результатов.

g.V().has('label', 'product')
   .has('id', 'product1')
   .outE('has_image')
   .has('primary', true)
   .inV()
   .choose(fold().coalesce(unfold().values('public_url'), constant('x')).is(neq('x')))
       .option(true, 
           addV('image')
               .property('description', '')
               .property('created_at', '2019-10-31 09:08:15')
               .property('updated_at', '2019-10-31 09:08:15')
               .property('pk', 'f920a210-fbbd-11e9-bed6-b9a9c92913ef')
               .property('path', 'product_images/87wfMABXBodgXL1O4aIf6BcMMG47ueUztjNCkGxP.png')
               .V()
               .hasLabel('product')
               .has('id', 'product1')
               .addE('has_image')
               .property('primary', false))
       .option(false, 
           addV('image')
               .property('description', '')
               .property('created_at', '2019-10-31 09:08:15')
               .property('updated_at', '2019-10-31 09:08:15')
               .property('pk', 'f920a930-fbbd-11e9-b444-8bccc55453b9')
               .property('path', 'product_images/87wfMABXBodgXL1O4aIf6BcMMG47ueUztjNCkGxP.png')
               .V()
               .hasLabel('product')
               .has('id', 'product1')
               .addE('has_image')
               .property('primary', true))

Я пытаюсь установить свойство primary вновь добавленного ребра между image вершина и product вершина, в зависимости от того, является лиproduct уже подключен к image, где ребро уже имеет primary, установленное в значение true.

, если product уже имеет image со свойством ребра: primary:true затемвновь добавленное изображение, которое будет связано с продуктом, должно иметь ребро со свойством primary:false

Seed azure graphdb:

//add product vertex
g.addV('product').property(id, 'product1').property('pk', 'product1')

//add image vertex
g.addV('image').property(id, 'image1').property('public_url', 'url_1').property('pk', 'image1');


//link products to images

g.V('product1').addE('has_image').to(V('image1')).property('primary', true)

1 Ответ

2 голосов
/ 31 октября 2019

Я удивлен, что ваш обход проходит без ошибок, так как я столкнулся с несколькими проблемами синтаксиса, связанными с вашим использованием option() и некоторыми другими проблемами с вашим смешением T.id и ключом свойства "id" (последний из которыхможет быть частью вашей проблемы, почему это не работает как есть, но я не совсем уверен). Конечно, я не тестировал CosmosDB, так что, возможно, они взяли на себя такую ​​свободу с языком Гремлин.

В любом случае, если я правильно следовал вашим объяснениям, я думаю, что есть способ значительно упростить ваш Gremlin. Я думаю, вам просто нужно это:

g.V('product1').as('p').
  addV('image').
    property('description', '').
    property('created_at', '2019-10-31 09:08:15').
    property('updated_at', '2019-10-31 09:08:15').
    property('pk', 'f920a210-fbbd-11e9-bed6-b9a9c92913ef').
    property('path', 'product_images/87wfMABXBodgXL1O4aIf6BcMMG47ueUztjNCkGxP.png').
    addE('has_image').
      from('p').
    property('primary', choose(select('p').outE('has_image').values('primary').is(true), 
                          constant(false), constant(true)))

Теперь я бы сказал, что это самый идиоматический подход для Gremlin, и, поскольку я не тестировал CosmosDB, я не могу сказать, будет ли этот подход работатьдля вас, но, возможно, глядя на мою консольную сессию ниже, вы можете увидеть, что она действительно соответствует вашим ожиданиям:

gremlin> g.V('product1').as('p').
......1>   addV('image').
......2>     property('description', '').
......3>     property('created_at', '2019-10-31 09:08:15').
......4>     property('updated_at', '2019-10-31 09:08:15').
......5>     property('pk', 'f920a210-fbbd-11e9-bed6-b9a9c92913ef').
......6>     property('path', 'product_images/87wfMABXBodgXL1O4aIf6BcMMG47ueUztjNCkGxP.png').
......7>     addE('has_image').
......8>       from('p').
......9>     property('primary', choose(select('p').outE('has_image').values('primary').is(true), constant(false), constant(true)))
==>e[31][product1-has_image->25]
gremlin> g.E().elementMap()
==>[id:31,label:has_image,IN:[id:25,label:image],OUT:[id:product1,label:product],primary:true]
gremlin> g.V('product1').as('p').
......1>   addV('image').
......2>     property('description', '').
......3>     property('created_at', '2019-10-31 09:08:15').
......4>     property('updated_at', '2019-10-31 09:08:15').
......5>     property('pk', 'f920a210-fbbd-11e9-bed6-b9a9c92913ef').
......6>     property('path', 'product_images/87wfMABXBodgXL1O4aIf6BcMMG47ueUztjNCkGxP.png').
......7>     addE('has_image').
......8>       from('p').
......9>     property('primary', choose(select('p').outE('has_image').values('primary').is(true), constant(false), constant(true)))
==>e[38][product1-has_image->32]
gremlin> g.E().elementMap()
==>[id:38,label:has_image,IN:[id:32,label:image],OUT:[id:product1,label:product],primary:false]
==>[id:31,label:has_image,IN:[id:25,label:image],OUT:[id:product1,label:product],primary:true]
gremlin> g.V('product1').as('p').
......1>   addV('image').
......2>     property('description', '').
......3>     property('created_at', '2019-10-31 09:08:15').
......4>     property('updated_at', '2019-10-31 09:08:15').
......5>     property('pk', 'f920a210-fbbd-11e9-bed6-b9a9c92913ef').
......6>     property('path', 'product_images/87wfMABXBodgXL1O4aIf6BcMMG47ueUztjNCkGxP.png').
......7>     addE('has_image').
......8>       from('p').
......9>     property('primary', choose(select('p').outE('has_image').values('primary').is(true), constant(false), constant(true)))
==>e[45][product1-has_image->39]
gremlin> g.E().elementMap()
==>[id:38,label:has_image,IN:[id:32,label:image],OUT:[id:product1,label:product],primary:false]
==>[id:45,label:has_image,IN:[id:39,label:image],OUT:[id:product1,label:product],primary:false]
==>[id:31,label:has_image,IN:[id:25,label:image],OUT:[id:product1,label:product],primary:true]

Если это выглядит правильно, и это не работает должным образом в CosmosDB, это из-за строки 9, котораяиспользует Traversal в качестве аргумента для property(), который еще не поддерживается в CosmosDB. Решение проблемы заключается в том, чтобы просто немного перевернуть эту строку:

g.V('product1').as('p').
  addV('image').
    property('description', '').
    property('created_at', '2019-10-31 09:08:15').
    property('updated_at', '2019-10-31 09:08:15').
    property('pk', 'f920a210-fbbd-11e9-bed6-b9a9c92913ef').
    property('path', 'product_images/87wfMABXBodgXL1O4aIf6BcMMG47ueUztjNCkGxP.png').
    addE('has_image').
      from('p').
    choose(select('p').outE('has_image').values('primary').is(true), 
           property('primary', false), 
           property('primary', true))

Я считаю, что этот подход немного менее читабелен, поскольку property() не совпадает с addE(), но это не ужасная альтернатива.

...