Поиск по шаблону Azure Cosmos DB
Можно ли искать свойства Вершины с помощью a содержит в Azure Cosmos Graph DB?
Например, я хотел бы найти всех лиц, у которых 'Jr'
есть имя?
g.V().hasLabel('person').has('name',within('Jr')).values('name')
Кажется, что функция within('')
только фильтрует значения, которые в точности равны 'Jr'
. Я ищу список. Идеально нечувствительный к регистру.
Ответы
Ответ 1
В настоящее время для CosmosDB не доступны никакие функции сопоставления текста. Тем не менее, я смог реализовать функцию поиска подстановочных знаков, используя UDF (User Defined Function), которая использует функцию Javascript match():
function userDefinedFunction(input, pattern) { return input.match(pattern) !== null; };
Затем вам нужно будет написать свой запрос как SQL и использовать UDF, который вы определили (в приведенном ниже примере предполагается, что вы вызвали функцию "REGEX"
SELECT * FROM c where(udf.REGEX(c.name[0]._value, '.*Jr.*') and c.label='person')
Производительность будет далека от идеальной, поэтому вам нужно решить, приемлемо ли решение или нет, исходя из ваших латентных и стоимостных перспектив.
Ответ 2
Команда Azure внедрила предикаты Tinkerpop для String.
Команда Azure "объявила" об этом пользователю здесь, на их веб-сайте обратной связи.
Я не проверил все из них, но содержит работы для меня (хотя с учетом регистра)
g.V().hasLabel('doc').or(__.has('title', containing('truc')), __.has('tags', containing('truc')))
TextP.startingWith (строка)
Входящая строка начинается с предоставленной строки?
TextP.endingWith (строка)
Заканчивается ли входящая строка предоставленной строкой?
TextP.containing (строка)
Содержит ли входящая строка предоставленную строку?
TextP.notStartingWith (строка)
Входящая строка не начинается с указанной строки?
TextP.notEndingWith (строка)
Разве входящая строка не заканчивается предоставленной строкой?
TextP.notContaining (строка)
Входящая строка не содержит предоставленную строку?