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

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

gremlin> gV (). ValueMap (true)

==> {id = a, x = [foo], label =вершина}

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

gremlin> gV (). has ('x', 'foo')

==> v[a]

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

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

gV (). Has ('x', 'foo'). Или (__. HasNot ('y'), __. Has ('y', 'bar'))

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

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

Джоэл

1 Ответ

1 голос
/ 18 марта 2019

Нет ничего плохого в вашем 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().

...