Apache TinkerPop Gremlin Vertex Equality

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

Это моя текущая попытка, но она явно неверна:

g.V().hasLabel('foo')
  .as('rule')
.repeat(out('belongs_to')).times(2)
.where(
  in('accepts').is(neq('rule'))
)

Как я могу проверить равенство вершин в Gremlin? Как отфильтровать все пути, где существует такое равенство?


person Omar Darwish    schedule 23.07.2019    source источник


Ответы (1)


where() соответствует начальной и конечной меткам, поэтому вы можете использовать where(in('accepts').as('rule')). И так как вы хотите исключить те вершины, которые соответствуют шаблону, вам нужно инвертировать эту часть, используя not().

g.V().hasLabel('foo').as('rule').
  repeat(out('belongs_to')).
    times(2).
  not(where(__.in('accepts').as('rule')))
person Daniel Kuppitz    schedule 24.07.2019
comment
Спасибо, Даниэль! Что делать, если из этой вершины много accepts ребер. Я хочу исключить любые пути, включающие эту вершину, если любое из этих accepts ребер вернется в исходную вершину. Я думаю, что это решение обрежет только пути, которые имеют это ребро, а не родительскую вершину, верно? В любом случае, это именно то, о чем я спрашивал, но я был бы признателен за любые дополнительные разъяснения, которые вы могли бы предложить! - person Omar Darwish; 24.07.2019
comment
Итак, если какая-либо вершина на пути имеет accepts ребро, которое восходит к начальной вершине, вы хотите исключить его? В этом случае вы просто переместите весь not(...) шаг фильтра на шаг repeat(). - person Daniel Kuppitz; 24.07.2019
comment
Это в высшей степени неочевидно, и это решило проблему, в которой я застрял на целый день. Спасибо! - person chrylis -cautiouslyoptimistic-; 03.03.2021