как сделать Гремлин содержать поиск как числа, так и строки - PullRequest
2 голосов
/ 26 мая 2020

Neptune 1.0.2.1 + Gremlin + nodejs.

У меня есть вершина и свойство, например Vertex - Device, property - Test, свойство Test может хранить различные типы данных, например число и строку

Vertex 1 - Test = ['ABCD', 'xyz'] Vertex 2 - Test = [123, 'XYZ']

Я хочу выполнить поиск по содержимому, например Test = A или Test = 123 независимо от типа данных.

Я пытался

queryText = 'BC' //this throw error
or queryText = 123 //this actually works
//I expect both case should hit the result.

g.V().hasLabel('Device').or(__.has('Test', parseFloat(queryText)), __.has('Test', textP.containing(queryText)));

, но получал ошибку InternalFailureException

Возможно ли, что я могу написать один запрос независимо от типа данных?

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

1 Ответ

2 голосов
/ 26 мая 2020

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

В вашем примере

g.V().hasLabel('Device').or(__.has('Test', parseFloat(queryText), __.has('Test', textP.containing(queryText))));

Что должно быть

g.V().hasLabel('Device').or(__.has('Test', parseFloat(queryText)), __.has('Test', textP.containing(queryText)));

EDITED и UPDATED

С исправленным запросом и дополнительными пояснениями о модели данных, содержащей разные типы для одного и того же ключа свойства, я смог воспроизвести то, что вы видите. Однако такое же поведение можно увидеть с использованием TinkerGraph, а также Neptune. Сгенерированное сообщение об ошибке немного отличается, но смысл тот же. Учитывая тот факт, что TinkerGraph ведет себя одинаково, я считаю, что Нептун ведет себя согласованно с «эталонной» реализацией. Тем не менее, возникает вопрос, должны ли предикаты TextP быть умнее и проверять тип свойства перед попыткой теста.

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('test').property('x',12.5)
==>v[0]
gremlin> g.addV('test').property('x','ABCDEF')
==>v[2]
gremlin> g.V().hasLabel('test').or(has('x',12.3),has('x',TextP.containing('CDE')))
java.math.BigDecimal cannot be cast to java.lang.String
Type ':help' or ':h' for help.
Display stack trace? [yN]  

ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ

Я создал задачу Jira, чтобы сообщество Apache TinkerPop могло рассмотреть возможность внесения изменений в предикаты TextP.

https://issues.apache.org/jira/browse/TINKERPOP-2375

...