java - Gremlin 不区分大小写的搜索

标签 java graph-databases gremlin case-insensitive

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

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

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

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

谢谢。

最佳答案

官方称,Gremlin 目前只有三个文本 predicates此时由 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 支持不区分大小写的全文搜索以及大量 other options 。 DS Graph 还有一个rich text search system在基本 Gremlin 选项之上。因此,如果您对所描述的搜索类型有明确的需求,您可能需要研究各个图形系统提供的选项。

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

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

lambda 的缺点是:

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

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

更新:从 TinkerPop 3.6.0 开始,Gremlin 现在有一个 TextP.regex 谓词,可以帮助执行以下类型的搜索:

gremlin> g.V().has('name', TextP.regex('[M|m].*o')).elementMap()
==>[id:1,label:person,name:marko,age:29]
gremlin> g.V().has('name', TextP.regex('(?i)M.*O')).elementMap()
==>[id:1,label:person,name:marko,age:29]

请注意,(?i) 启用 Java 的 Pattern.CASE_INSENSITIVE 模式匹配模式。

关于java - Gremlin 不区分大小写的搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58102960/

相关文章:

java - 将java中的时间调整为前一小时边界

java - 直接赋值 `set1.addAll(set2)`的结果Set

java - 在 Java 类中设置启动参数

java - 无法从 Activity 中获取 getSupportFragmentManager,错误是 Activity 正在被销毁

graph-databases - 传感器数据的图形数据库 - 如何对关系建模?

graph-databases - 我应该能够在 OrientDB 中的两条边和/或一条边和一个节点之间创建边吗?

Gremlin 找到最高匹配

neo4j - 是否可以使用数据驱动的节点或关系标签进行合并?

orientdb - 如何使用 Gremlin 在 orientdb 中创建自定义类

javascript - 用于添加边缘的 gremlin 服务器查询