Всегда лучше предоставить скрипт 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]