使用Gremlin Graph API在azure cosmos db中搜索通配符或“LIKE”

时间:2017-12-10 22:14:14

标签: azure-cosmosdb gremlin

我正在尝试在一种通配符搜索中搜索顶点。在SQL中它将是:“其中名称如'%abc%'”。 Gremlin图遍历和SQL查询都不支持它。

用例是过滤1:n依赖关系,例如: “告诉我所有名字都包含'Sam'的客户。”使用SQL非常简单。它不是一个全面的全文搜索,而只是这个特定的1:n关联中的过滤器。

以下SQL工作:

SELECT * FROM g 
  where (g.label = "person" and g.name[0]._value = 'Sam')

相当于:

g.V().hasLabel("person").has("name", "Sam")

以下SQL不起作用(“语法错误,'like'附近的语法不正确):

SELECT * FROM g 
  where (g.label = "person" and g.name[0]._value like 'Sam')

尝试在Gremlin“过滤器”步骤中使用lambda也会导致错误。

为这种搜索编写UDF或存储过程是一个好主意吗?在这种情况下如何处理索引?还有其他选择吗?

非常感谢

2 个答案:

答案 0 :(得分:2)

这样的事情:

g.V().has("person", "name", between("Sam", "San"))

Kelvin Lawrence写道a book on Gremlin你可能会觉得有帮助(我做过!)。

答案 1 :(得分:1)

我对Azure的gremlin实现和模糊匹配的实施方式有所了解

在这个阶段你可以采取几种方法,但最好的解决方案取决于你的目标和限制,希望这些可以构成一些灵感......

您可以采用的一种方法是在存储库/数据访问层中实现缓存层,并使用代码查询内存中的集合

另一种选择,取决于您要搜索的模式的复杂程度,是将名称分解为段(实际上将在准确度级别下降)并自由搜索部分名称

E.g。

姓名= Sam Smith

属性:

Firstname = Sam,

FirstNameInitial = S,

姓氏=史密斯,

LastnameInitial = S

初始数据

g.addV('Person').property('Firstname', 'Sam').property('FirstnameInitial', 'S').property('Lastname', 'Smith').property('LastnameInitial', 'S')

查询数据

g.V().has('label', 'Person').has('Firstname', 'Sa').has('Lastname', 'Smit').fold().coalesce(
    unfold(),
    g.V().has('label', 'Person').has('FirstnameInitial', 'S').has('Lastname', 'Smit'),
    g.V().has('label', 'Person').has('Firstname', 'Sam').has('LastnameInitial', 'S'),
    g.V().has('label', 'Person').has('FirstnameInitial', 'S').has('LastnameInitial', 'S')
)

Coalesce按顺序评估逗号分隔的术语,返回第一个非空集。与折叠和展开一起使用这种方式,第一个术语(.fold(。。coalesce()之前的所有内容)将首先返回,如果可以的话(通过 强制语句中的展开),它将会然后按顺序尝试以下每个逗号分隔的查询。

通过这种方式,可以非常具体地开始搜索,并且可以回归到更通用的搜索。显然,你可以采取概念并将其发展为包括“Lastname2Initials',' Lastname3Initials'等等

希望这可以帮助你,让我知道你最终解决的问题!