Гремлин: как преодолеть проблему нулевого свойства и написать запрос, который обновляет все свойства определенной вершины? - PullRequest
0 голосов
/ 26 апреля 2019

Мне нужно написать один запрос Gremlin, который может установить новые значения свойств вершины. Все имена свойств известны заранее (в этом примере: Тип, Страна, Статус). Некоторые из значений свойств могут быть нулевыми - и я не знаю, какие из них заранее. Запрос должен работать для всех случаев. Например, скажем, у меня в настоящее время есть этот запрос:

g.V(123). property('Type',Type). property('Country',Country). property('Status',Status)

Этот запрос работает нормально, если все значения параметров (Тип, Страна, Состояние) не равны NULL. Если, скажем, Страна пуста, я получаю ошибку:

The AddPropertyStep does not have a provided value: AddPropertyStep({key=[Country]})

В таком случае мне нужно будет использовать другой запрос для удаления свойства (кстати, есть ли лучший способ удаления свойства?):

g.V(123). property('Type',Type). property('Status',Status). properties('Country').drop()

Можно ли написать универсальный запрос, который может обрабатывать как нулевые, так и ненулевые значения? Я не могу использовать консоль или программирование, нужно выполнить только один запрос Gremlin.

Спасибо!

1 Ответ

0 голосов
/ 26 апреля 2019

TinkerPop не допускает значений null в свойствах (хотя, я полагаю, вы можете найти там некоторые графические базы данных, допускающие различную семантику), поэтому вам следует заранее проверить данные, чтобы убедиться, что они имеют какое-то значимое «пустое значение» в отличие от null. Если вы не можете этого сделать по какой-то причине, я думаю, вы могли бы использовать choose() step для «проверки на ноль»:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has('person','name','marko').valueMap()
==>[name:[marko],age:[29]]
gremlin> age = null
gremlin> g.V().has('person','name','marko').choose(constant(age).count().is(0), properties('age').drop(),property('age',age))
gremlin> g.V().has('person','name','marko').valueMap()
==>[name:[marko]]
gremlin> age = 30
==>30
gremlin> g.V().has('person','name','marko').choose(constant(age).count().is(0), properties('age').drop(),property('age',age))
==>v[1]
gremlin> g.V().has('person','name','marko').valueMap()
==>[name:[marko],age:[30]]

Проверка для "является нулем" в основном просто: constant(age).count().is(0), который опирается на семантику Гремлин для значений null в потоке, который является пустым и дает count() нуля. Это работает, но делает ваш Gremlin немного менее читабельным. Это может быть хорошим шагом DSL , который нужно добавить, если вам нужно много писать.

...