【问题标题】:how to do Gremlin contain search for both number and string如何做 Gremlin 包含对数字和字符串的搜索
【发布时间】:2020-05-26 02:14:48
【问题描述】:

海王星 1.0.2.1 + Gremlin + nodejs。

我有一个顶点和属性,例如Vertex - 设备,属性 - 测试,测试属性可以存储不同类型的数据,例如数字和字符串

顶点 1 - 测试 = ['ABCD','xyz'] 顶点 2 - 测试 = [123,'XYZ']

我想做一个“包含”搜索,例如无论数据类型如何,Test=A 或 Test=123。

我在尝试

queryText = 'BC' //this throw error
or queryText = 123 //this actually works
//I expect both case should hit the result.

g.V().hasLabel('Device').or(__.has('Test', parseFloat(queryText)), __.has('Test', textP.containing(queryText)));

但得到'InternalFailureException\'错误

无论数据类型如何,我都可以编写一个查询吗?

如果不可能,或者至少在我知道数据类型的情况下使 textP. contains 与多个查询一起工作?现在如果属性包含数字,则包含搜索抛出错误

【问题讨论】:

  • 您使用的是哪个版本的海王星引擎?到目前为止,我无法重现您看到的错误。这对我的一个 grapgs 有用。 gremlin> g.V('3').or(has('city',TextP. contains('sti')),has('city',123))
  • 查看答案 我认为您的括号放错了位置。

标签: node.js gremlin amazon-neptune


【解决方案1】:

看起来您在 or() 步骤中的右括号位置错误。您需要在逗号之前关闭第一个 has 步骤。

在你的例子中

g.V().hasLabel('Device').or(__.has('Test', parseFloat(queryText), __.has('Test', textP.containing(queryText))));

应该是这样的

g.V().hasLabel('Device').or(__.has('Test', parseFloat(queryText)), __.has('Test', textP.containing(queryText)));

编辑和更新

通过更正的查询和关于包含相同属性键的不同类型的数据模型的额外说明,我能够重现您所看到的内容。但是,使用 TinkerGraph 和 Neptune 可以看到相同的行为。生成的错误信息略有不同,但含义相同。鉴于 TinkerGraph 的行为方式相同,我认为 Neptune 的行为与“参考”实现一致。也就是说,这引发了一个问题,即 TextP 谓词是否应该更智能并在尝试测试之前检查属性的类型。

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('test').property('x',12.5)
==>v[0]
gremlin> g.addV('test').property('x','ABCDEF')
==>v[2]
gremlin> g.V().hasLabel('test').or(has('x',12.3),has('x',TextP.containing('CDE')))
java.math.BigDecimal cannot be cast to java.lang.String
Type ':help' or ':h' for help.
Display stack trace? [yN]  

额外更新

我创建了一个 Jira 问题,以便 Apache TinkerPop 社区可以考虑对 TextP 谓词进行更改。

https://issues.apache.org/jira/browse/TINKERPOP-2375

【讨论】:

  • 对不起,这是一个错字,括号不是问题,我认为问题是我是否在一个属性中有多个值,例如对于顶点 1,Test=[22,'string1','string2'],对于顶点 2,Test=['string0','string1'],然后我得到 UnsupportedOperationException\ 错误
  • 我在海王星 1.0.2.1
  • 尝试按字符串搜索,如果可以重现错误,则在单个 v 属性中具有多种数据类型
  • 好的,我做了更多的测试,我认为这与单个属性中的多个值无关,只要我的属性具有不同的数据类型,textP. contains 就会抛出错误
  • 好的,感谢您的澄清。我将使用您描述的配置对此进行更多研究。如果您从 Gremlin 控制台运行查询,是否会看到相同的错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2011-05-25
  • 2019-05-17
  • 2013-06-26
  • 2013-11-10
  • 1970-01-01
相关资源
最近更新 更多