Гремлин: можно ли фильтровать необязательные свойства? (база данных графиков - Нептун)

У меня есть граф с единственной вершиной:

gremlin> g.V (). valueMap (истина)

==> {id = a, x = [foo], label = vertex}

Вершину можно найти в следующем запросе:

gremlin> g.V (). имеет ('x', 'foo')

==>v[a]

Однако я хотел бы изменить приведенный выше запрос с дополнительным ограничением соответствия: сопоставить вершину, если у нее нет свойства «y», или если вершина имеет свойство «y», а значение свойства «y» равно »bar. ".

Я построил следующий запрос.

g.V (). has ('x', 'foo'). или (__. hasNot ('y'), __. has ('y', 'bar'))

Запрос не возвращает подходящих вершин. Итак, я думаю, что ищу что-то эквивалентное «IFNULL ()» в mysql.

Любой совет очень ценится!

Джоэл


person Joel Stevick    schedule 18.03.2019    source источник


Ответы (1)


Нет ничего плохого в вашем or() фильтре, он должен просто работать.

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV().property(id, 'a').property('x', 'foo').iterate()
gremlin> g.V().has('x', 'foo').or(__.hasNot('y'), __.has('y', 'bar'))
==>v[a]

В качестве альтернативы вы можете проверить, нет ли y значения, отличного от bar.

gremlin> g.V().has('x', 'foo').not(__.values('y').is(neq('bar')))
==>v[a]

Однако двойное отрицание сбивает с толку, поэтому я просто выберу or().

person Daniel Kuppitz    schedule 18.03.2019
comment
Ой! он работает с TinkerGraph, но не с моей реальной базой данных графов (Neptune). Мысли? - person Joel Stevick; 18.03.2019
comment
А как насчет двойного отрицания? Я полагаю, это сработает. - person Daniel Kuppitz; 18.03.2019
comment
Да, двойное отрицание сработало, спасибо! - но g.V (). has ('x', 'foo'). или (__. hasNot ('y'), __. has ('y', 'bar')) не работает. - person Joel Stevick; 18.03.2019
comment
Поговорили об этом с aws, они подтвердили, что это известная ошибка в Нептуне. Они предложили следующий обходной путь: gV (). Has ('x', 'foo'). Union (__. HasNot ('y'), __. Has ('y', 'bar')) (с использованием UNION вместо ИЛИ) - person Joel Stevick; 20.03.2019