Селективный обход Гремлин - PullRequest
1 голос
/ 27 марта 2020

Это может быть ладья ie Вопрос Гремлин:

Допустим, у меня есть этот график

A [знает --->] B

A [знает --->] C

D [знает --->] C

Я хочу пройти этот граф и найти узлы, которые знает только A, в данном случае B и не C, потому что и А и D знают C. Есть ли способ сделать это с Gremlin?

Редактировать: Извините, я должен был быть более точным в вопросе изначально Количество входящих ребер может быть на самом деле переменным.

g.addV('A').as('a')
  .addV('B').as('b')
  .addV('C').as('c')
  .addV('D').as('d')
  .addV('E').as('e')
  .addV('F')as('f')
  .addE('knows').from('a').to('c')
  .addE('knows').from('b').to('c')
  .addE('knows').from('a').to('f')
  .addE('knows').from('b').to('f')
  .addE('knows').from('d').to('f')

В этом в случае, если я хочу только C, а не F, потому что A & B знает C и F оба, но D также знает F, поэтому я не хочу F.

1 Ответ

2 голосов
/ 27 марта 2020

Полезно иметь небольшой примерный график. Вот тот, который соответствует вашему вопросу.

g.addV('A').as('a').
  addV('B').as('b').
  addV('C').as('c').
  addV('D').as('d').
  addE('knows').from('a').to('b').
  addE('knows').from('a').to('c').
  addE('knows').from('d').to('c')    

Используя этот график, запрос на поиск друзей, уникальных для А, можно записать как

gremlin> g.V().hasLabel('A').
               out('knows').
               filter(__.in('knows').count().is(1)).
               path().
               by(label)  

==>[A,B] 

Отредактировано на основе обновленного вопроса.

ОК, поэтому, учитывая дополнительные критерии, я считаю, что это дает вам то, что вам нужно

gremlin>  g.V().hasLabel('A','B').
......1>        out().
......2>        groupCount().
......3>        unfold().
......4>        filter(select(values).is(2)).
......5>        select(keys).
......6>        where(__.in('knows').count().is(2)).
......7>        label()  

==>C   
...