Можем ли мы поставить и условия в краях в Гремлине - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть требование к положению и состоянию краев в гремлине.Есть ли у нас такой же механизм или условиеgV (). haslabel ('u'). outE ('label1', 'label2'). inV (). has ('name', 'name1')

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

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Всегда лучше предоставить скрипт Gremlin, который генерирует некоторые примеры данных, поскольку он делает контекст вопроса намного более понятным:

g.addV('u').as('u').
  addV('v').property('name','name1').as('v1').
  addV('v').property('name','name2').as('v2').
  addV('v').property('name','name1').as('v3').
  addE('label1').from('u').to('v1').
  addE('label2').from('u').to('v1').
  addE('label1').from('u').to('v2').
  addE('label2').from('u').to('v2').
  addE('label2').from('u').to('v3').iterate()

В этом случае я бы предположил, что вы хотите получить тольковершина, которую я пометил выше как «v1», так как это единственная вершина с двумя ребрами (одна с меткой «label1» и одна с меткой «label2») И с ключом свойства «name1».Кроме того, я предполагаю, что схема вашего графа будет учитывать только единичную кратность ребер, так что у вас будет либо ноль, либо одно ребро "label1" и "label2" между вершинами "u" и "v *".

Я выбрал этот подход, хотя могут быть и другие:

gremlin> g.V().hasLabel('u').
......1>   outE('label1','label2').
......2>   where(otherV().has('name','name1')).
......3>   groupCount().
......4>    by(otherV()).
......5>   unfold().
......6>   where(select(values).is(eq(2))).
......7>   select(keys).
......8>   unfold().
......9>   valueMap(true)
==>[id:1,name:[name1],label:v]

Главное здесь - рассмотреть groupCount(), который в основном дает вам количество ребер, соединяющихся с otherV().Вы хотите, чтобы они равнялись 2 для успеха фильтра.Таким образом, после groupCount() результирующее Map, содержащее otherV() для ключа и количество ребер для значения, разворачивается в записи и фильтруется в строке 6. Как только мы получим это, мы можем просто получить ключи изMap потому что нам больше не нужны счетчики.

Я также попробовал match(), который, как мне кажется, не поддерживается CosmosDB, но на самом деле в этом случае выглядит довольно хорошо:

gremlin> g.V().hasLabel('u').
......1>   match(__.as('u').out('label1').as('v'),
......2>         __.as('u').out('label2').as('v'),
......3>         __.as('v').has('name','name1')).
......4>   select('v').
......5>     by(valueMap(true))
==>[id:1,name:[name1],label:v]
0 голосов
/ 19 сентября 2018

То же самое имеет условия работы ()

...