首页 > 解决方案 > Gremlin 不区分大小写的搜索

问题描述

我是 Gremlin 的新手,我正在使用 Gremlin 控制台从图形数据库中读取数据。在图中,有标签为“设备”的顶点。这些顶点有一个与之关联的属性“名称”。我需要找出是否有一个具有特定名称的顶点。此检查必须不区分大小写。

假设我要在关系数据库中执行此操作,我可以编写以下查询:

SELECT * FROM device d WHERE LOWER(d.name) = 'mydevice'

我正在 Gremlin 中寻找类似于“LOWER”的功能。如果没有这样的功能,有人可以告诉我如何在不考虑字母大小写的情况下搜索顶点的属性吗?

谢谢你。

标签: javagraph-databasesgremlincase-insensitive

解决方案


正式地,Gremlin 目前只有三个文本谓词,由TextP:和(以及它们的否定)公开,但它们的默认实现是区分大小写的:startingWithendingWithcontaining

gremlin> g.V().has('person','name',containing('ark')).values('name')
==>marko
gremlin> g.V().has('person','name',containing('Ark')).values('name')
gremlin> 

根据您使用的启用 TinkerPop 的图形数据库,您可能拥有此类功能以及其他更高级的搜索选项(例如正则表达式)。例如,JanusGraph 支持不区分大小写的全文搜索以及许多其他选项。DS Graph在基本的 Gremlin 选项之上还有一个富文本搜索系统。因此,如果您明确需要您描述的搜索类型,您可能需要查看各个图形系统提供的选项。

虽然出于多种原因不建议您使用 lambda:

gremlin> g.V().filter{it.get().value('name').toUpperCase() == 'MARKO'}.values('name')
==>marko

lambdas 的缺点是:

  1. 并非所有提供商都支持它们,因此您的代码可移植性会降低
  2. 他们强制以比严格使用 Gremlin 步骤的遍历更昂贵的方式评估请求。

TinkerPop 正在慢慢识别不同供应商提供的搜索选项之间的共性,并将在机会出现时继续推广这些功能,以便它们可以作为 Gremlin 语言本身的一等公民使用。


推荐阅读