Java Gremlin不区分大小写搜索

Java Gremlin不区分大小写搜索,java,graph-databases,gremlin,case-insensitive,Java,Graph Databases,Gremlin,Case Insensitive,我对Gremlin是新手,我正在使用Gremlin控制台从图形数据库读取数据。在图中,有带有标签“Device”的顶点。这些顶点具有与其关联的属性“名称”。我需要找出是否有一个顶点有特定的名称。此检查必须不区分大小写 假设在关系数据库中执行此操作,我可以编写以下查询: SELECT * FROM device d WHERE LOWER(d.name) = 'mydevice' 我正在搜索一个类似于“小精灵”中“LOWER”的函数。如果没有这个函数,有人能告诉我如何在不考虑字母大小写的情况下搜

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

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

SELECT * FROM device d WHERE LOWER(d.name) = 'mydevice'
我正在搜索一个类似于“小精灵”中“LOWER”的函数。如果没有这个函数,有人能告诉我如何在不考虑字母大小写的情况下搜索顶点的属性吗


谢谢。

正式地说,Gremlin目前只有三个文本,正如
TextP
所披露的:
开头、
结尾和
包含
(以及它们的否定),但它们的默认实现是区分大小写的:

gremlin> g.V().has('person','name',containing('ark')).values('name')
==>marko
gremlin> g.V().has('person','name',containing('Ark')).values('name')
gremlin> 
根据您所使用的TinkerPop启用的图形数据库,您可能拥有此类功能以及其他更高级的搜索选项(例如regex)。例如,JanusGraph支持不区分大小写的全文搜索,并支持大量文本。DS Graph在基本的Gremlin选项之上还有一个新的选项。因此,如果您对所描述的搜索类型有明确的需求,那么您可能需要查看各个图形系统提供的选项

虽然由于一些原因不建议使用lambda,但您可以使用lambda:

gremlin> g.V().filter{it.get().value('name').toUpperCase() == 'MARKO'}.values('name')
==>marko
lambdas的缺点是:

  • 并非所有提供者都支持它们,因此您的代码可移植性降低
  • 它们迫使请求以比严格使用Gremlin步骤的遍历更昂贵的方式进行评估

  • TinkerPop正在慢慢地识别不同供应商提供的搜索选项之间的共性,并将随着opportunity的出现而继续推广这些功能,以便它们能够以Gremlin语言本身作为一流公民使用。

    感谢您的快速回复。当我尝试使用您定义的lambda时,我得到了一个如下开头的异常:WARN org.apache.tinkerpop.gremlin.driver.MessageSerializer-Request[RequestMessage{,requestId=580bb852-074f-4cfd-979f-8929d07c45f6,op='bytecode',processor='traversal',args={gremlin=[[],[V(),filter(groovysh\u evaluate$run_closure1@5e7c141d),价值观(名称)],别名={g=g}}]org.apache.tinkerpop.gremlin.driver.ser.AbstractGryMessageSerializerV3d0.java.lang.IllegalArgumentException无法序列化:类未注册:java.lang.reflect.Invocation…如果您远程到gremlin服务器,则需要使用字符串lambda-假设您正在使用java,则此链接将有帮助:如果您正在使用另一个language每个部分都有类似的部分-只需滚动一点或使用左侧的目录。此外……您可以将精确的Gremlin遍历作为脚本发送到Gremlin服务器:(但这不是首选)它是有效的。非常感谢。我想到的另一个解决方法是获取“name”属性的所有值,然后在代码中迭代以查看是否存在匹配项。你知道使用lambda是否比这种方法效率更低吗?我想这取决于搜索的宽度。如果你有一百万个“设备”如果你能用其他搜索条件限制这个数字,而这些搜索条件使用的索引只能是几十个“设备”,那么在代码中返回迭代的“名称”就不会有那么好的效果然后顶点就可以工作了。请注意,您可能无论如何都需要这样做,因为lambda不会解析为索引查找,因为图形无法优化lambda表达式。因此,假设您限制为几十个顶点,我不知道lambda是否会比在客户端上使用代码迭代更快-您必须进行测试