Gremlin如何查询与搜索功能相同的sql

Min*_*Loc 8 sql orientdb gremlin

我使用OrientDB类型图.我需要Gremlin的语法来搜索相同的SQL LIKE运算符

LIKE 'search%' or LIKE '%search%'
Run Code Online (Sandbox Code Playgroud)

我已经检查过has和filter(在http://gremlindocs.com/中).但是必须确定使用type属性传递的确切值.我认为这与搜索逻辑不一致.

谢谢你的一切.

小智 10

对于 Cosmos Db Gremlin 支持

g.V().has('foo', TextP.containing('search'))
Run Code Online (Sandbox Code Playgroud)

您可以找到Microsoft Gremlin 支持文档TinkerPop 参考文档


Dan*_*itz 7

尝试:

g.V().filter({ it.getProperty("foo").startsWith("search") })
Run Code Online (Sandbox Code Playgroud)

要么

g.V().filter({ it.getProperty("foo").contains("search") })
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@Daniel.它也适用于`.matches("search.*")`. (2认同)

ste*_*tte 6

您可以使用filter一些正则表达式:

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.V.filter{it.name.matches(".*ark.*")}.name
==>marko
Run Code Online (Sandbox Code Playgroud)

或者使用更多 Groovy 语法糖:

gremlin> g.V.filter{it.name==~/.*ark.*/}.name 
==>marko
Run Code Online (Sandbox Code Playgroud)

上面的答案(和接受的答案)适用于 TinkerPop 2.x,以下适用于当前广泛使用的版本3.x

目前 TinkerPop 3.x 不支持正则表达式作为 Gremlin 核心语言的一部分,但是正则表达式可能适用于您正在使用的特定图形系统(DSE Graph、JanusGraph 等)并且这些图形将提供自己的库来扩展带有正则表达式谓词(和/或其他搜索选项,如模糊和标记化)的 Gremlin。有关可用的内容,请查阅图表的文档。

图特定扩展将是进行基于正则表达式的搜索的最有效方法,因为它依赖于经过优化以处理此类事情的内部索引函数,但是有一些方法可以通过类似的闭包进行内存中的正则表达式搜索到上面的 TinkerPop 2.x 答案。

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().filter{it.get().value('name').matches(".*ark.*")}
==>v[1]
Run Code Online (Sandbox Code Playgroud)

由于我们使用的是闭包,因此我们可以在该函数中放置我们想要的任何 Java(在本例中为 Groovy)代码。注意,对于it.get().value('name')it是一个Groovy表示法得到表示当前Traverser的流中V(),并将其保持Vertex经由检索的对象get()

这种方法适用于接受闭包的任何地方,但它们并不适用于任何地方,因为并非所有图都支持它们。如果您不在 JVM(例如 python)上,那么您可能会将 Gremlin 脚本提交到服务器或使用基于字节码的请求。如果您正在提交脚本,那么您应该能够提交如上所示的请求。如果您使用的是字节码,那么您必须在遍历中将 lambda 显式声明为字符串,如此针对 Python所示。

最终,不推荐使用闭包/lambdas,因为它们会降低代码的可移植性、暴露安全漏洞等。如果您需要正则表达式,最好使用对它们有本机支持的图和包含特定于您的编程语言的自定义谓词。