как исключить вершины на основе ребер с помощью графа gremlin / IBM

Я работаю с графом IBM и использую gremlin, чтобы попытаться отфильтровать определенные вершины. На моих краях есть две обязательные и необязательные метки. это ситуация:

   V3 -- V5 -- V6
  /  \
V1    \
  \    \
   V2 -- V4

Это немного похоже на цепочку спроса и предложения. V1 - это объект, который обеспечивает два типа поставок (V3 и V2). Для работы V4 требуются оба расходных материала. Для работы V5 необходимы как V3, так и V6. Так как у меня только V2 и V3. Мне нужен запрос, который позволяет мне переходить от V2 и V3 к каждой исходящей вершине, но исключать вершину в зависимости от того, имеет ли эта вершина необходимое ребро (но допускает дополнительные ребра).

После долгих попыток вот что придумал коллега:

def g = graph.traversal(); g.V(1).out().outE().aggregate('edges').inV().where(inE('required').where(not(within('edges'))).count().is(eq(0))).dedup()

Это лучший способ сделать это? Или есть способ поумнее?


person Mischa    schedule 31.05.2017    source источник


Ответы (1)


Предполагая, что это ваш график:

gremlin> g.addV().property(id,1).as('1').
......1>   addV().property(id,2).as('2').
......2>   addV().property(id,3).as('3').
......3>   addV().property(id,4).as('4').
......4>   addV().property(id,5).as('5').
......5>   addV().property(id,6).as('6').
......6>   addE('supplies').from('1').to('2').
......7>   addE('supplies').from('1').to('3').
......8>   addE('required').from('2').to('4').
......9>   addE('required').from('3').to('4').
.....10>   addE('required').from('3').to('5').
.....11>   addE('required').from('6').to('5').iterate()

и это ожидаемый результат:

gremlin> g.V(1).
......1>   out().
......2>   outE().
......3>   aggregate('edges').
......4>   inV().
......5>   where(inE('required').
......6>         where(not(within('edges'))).
......7>         count().is(eq(0))).
......8>   dedup()  
==>v[4]

Тогда объединение кромок с уже пройденными кромками, вероятно, является лучшим подходом. (Всегда лучше включать образец графика в качестве сценария Gremlin в ваши вопросы.) Я полагаю, стоит отметить, что вам не нужен eq() в вашем is(), а not(without(...)) - это просто without:

gremlin> g.V(1).
......1>   out().
......2>   outE().
......3>   aggregate('edges').
......4>   inV().
......5>   where(inE('required').
......6>         where(without('edges')).
......7>         count().is(0)).
......8>   dedup() 
==>v[4]

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

gremlin> g.V(1).
......1>   out().
......2>   outE().
......3>   aggregate('edges').
......4>   inV().
......5>   not(inE('required').
......6>       where(without('edges'))).
......7>   dedup()
==>v[4]

Вышеупомянутый подход может быть лучше, поскольку немедленное возвращение только одного ребра из вашего фильтра inE('required').where(not(within('edges'))) немедленно отфильтрует вершину, и вам не нужно ждать подсчета всех ребер.

person stephen mallette    schedule 31.05.2017
comment
ваши предположения верны. Хотелось бы добавить образец графика, но не знаю, как бы я это сделал. Мы потратили много времени на то, чтобы попробовать что-то подобное, но не смогли заставить это работать. С вашим решением это просто работает. Спасибо за предложения. Думаю, это улучшит наш запрос. - person Mischa; 31.05.2017