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

5 gremlin azure-cosmosdb

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

用例是过滤 1:n 依赖项,例如“向我显示名称包含 'Sam' 的所有客户”。这对于 SQL 来说是非常基本和容易的。它不是全面的全文搜索,而只是此特定 1:n 关系中的过滤器。

以下 SQL 有效:

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

这相当于:

g.V().hasLabel("person").has("name", "Sam")
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

非常感谢

hng*_*r18 2

我也遇到了有关 Azure 的 gremlin 和模糊匹配实现的砖墙限制

在这个阶段,您可以采取多种方法,但最好的解决方案取决于您的目标和限制,希望这些能够带来一些启发......

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

另一种选择是,根据您要搜索的模式的复杂性,将名称分解为多个片段(这将有效地降低准确度级别)并自由搜索名称的各个部分

例如

姓名 = 萨姆·史密斯

特性:

名字=山姆,

名字首字母 = S,

姓氏=史密斯,

姓氏首字母 = S

初始化数据

g.addV('Person').property('Firstname', 'Sam').property('FirstnameInitial', 'S').property('Lastname', 'Smith').property('LastnameInitial', 'S')
Run Code Online (Sandbox Code Playgroud)

查询数据

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')
)
Run Code Online (Sandbox Code Playgroud)

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

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

希望这对您有所帮助,让我知道您最终决定做什么!