我试图在一种通配符搜索中搜索顶点。在 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 或存储过程是个好主意吗?在这种情况下如何处理索引?有没有其他选择?
非常感谢
我也遇到了有关 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”等
希望这对您有所帮助,让我知道您最终决定做什么!
| 归档时间: |
|
| 查看次数: |
2519 次 |
| 最近记录: |