как фильтровать свойства со значениями в Neptune + nodejs

с Neptune + nodejs

g.V().hasLabel('A').properties()

возвращает:

id, label, value
1, 'p1','v1'
2, 'p1','b2'
3, 'p1','b3'
4, 'p1','d4'

как я могу сделать фильтр, чтобы он только возвращал:

id, label, value
2, 'p1','b2'
3, 'p1','b3'

Я пытался

g.V().hasLabel('Device').properties().value().is(containing('b'))

но выдает ошибку UnsupportedOperationException

Я тоже пробовал g.V().hasLabel('Device').where(properties().value().is(containing('b')))

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


person Zhongmin    schedule 28.05.2020    source источник


Ответы (2)


Вероятно, вам не нужно использовать properties, если вы не планируете что-то вроде удаления свойства. Вы должны просто уметь:

g.V().hasLabel('Device').has('value',containing('b'))

Я предполагаю, что «значение» - это имя вашей собственности. Если нет, поясните.

ИЗМЕНИТЬ, чтобы добавить больше примеров.

Если вы хотите протестировать все свойства, вы можете сделать что-то вроде этого, чтобы найти подходящие свойства.

gremlin> g.addV('test').property('x','Hello').
                        property('y','Another one').
           addV('test').property('y','Goodbye')

==>v[12b93051-decf-3be5-85cd-cbc4c27e42f9]

g.V().hasLabel('test').
      properties().hasValue(TextP.containing('ll'))

==>vp[x->Hello]

Если вам нужна вершина, содержащая свойства

gremlin> g.V().hasLabel('test').
             where(properties().hasValue(TextP.containing('ll')))

==>v[14b93051-dece-db72-9f46-46df7513a14c]
person Kelvin Lawrence    schedule 28.05.2020
comment
На самом деле у меня есть требование запрашивать все свойства, любые свойства содержат «xyz», есть ли способ заменить ваш пример «значения» на все свойства? - person Zhongmin; 29.05.2020
comment
Я добавил больше примеров, которые показывают, как получить либо совпадающие свойства, либо вершины, содержащие эти свойства. - person Kelvin Lawrence; 29.05.2020
comment
запрос не выполняется, если свойства содержат другой тип данных, например номер, я думаю, это известная проблема - person Zhongmin; 02.06.2020
comment
да. В ApacheTinkerpop Jira есть проблема, связанная с использованием предикатов TextP. - person Kelvin Lawrence; 02.06.2020

Вы можете использовать фильтр:

g.V().hasLabel('Device').filter({ it.getProperty("value").startsWith("b") })

or

g.V().hasLabel('Device').filter({ it.getProperty("value").contains("b") })

РЕДАКТИРОВАТЬ: этот запрос работает в чистой версии Gremlin, а не в версии Neptune.

person mehmet sahin    schedule 28.05.2020
comment
Желательно вообще избегать использования закрытий и придерживаться чистых шагов Gremlin. Поскольку OP использует Amazon Neptune, это тем более, что замыкания Groovy в запросах не поддерживаются. - person Kelvin Lawrence; 28.05.2020