【问题标题】:TinkerPop problem with multiple filters using and/or使用和/或的多个过滤器的 TinkerPop 问题
【发布时间】:2019-02-09 03:07:37
【问题描述】:

我正在过滤多个属性并获取一个节点,因此如果有多个 filterandor 连接。 2 工作正常,但从 3 日开始它似乎崩溃了。

以下是错误的简化演示。

filter

gremlin> g.V().filter(has("name", "marko"))
==>v[1]

gremlin> g.V().filter(has("name", "marko")).and().filter(has("name", "marko"))
==>v[1]

gremlin> g.V().filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko"))
java.util.ConcurrentModificationException
Type ':help' or ':h' for help.
Display stack trace? [yN]

没有filter

gremlin> g.V().has("name", "marko")
==>v[1]

gremlin> g.V().has("name", "marko").and().has("name", "marko")
==>v[1]

gremlin> g.V().has("name", "marko").and().has("name", "marko").and().has("name", "marko")
java.util.ConcurrentModificationException
Type ':help' or ':h' for help.
Display stack trace? [yN]

dummy-name 是不存在的东西。仍然会因不同的错误而崩溃

gremlin> g.V().hasLabel("dummy-name").filter(has("name", "a").or().has("name", "b").or().has("name", "c"))
    java.lang.ArrayIndexOutOfBoundsException
    Type ':help' or ':h' for help.
    Display stack trace? [yN]y
    java.lang.ArrayIndexOutOfBoundsException

当连接到 NEO4J 并使用 filter 时,它会抛出我

test_gremlin.py", line 49, in execut_final_query
    results = future_results.result()
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 432, in result
    return self.__get_result()
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/home/admin-12/.local/lib/python3.6/site-packages/gremlin_python/driver/resultset.py", line 81, in cb
    f.result()
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 425, in result
    return self.__get_result()
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/usr/lib/python3.6/concurrent/futures/thread.py", line 56, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/admin-12/.local/lib/python3.6/site-packages/gremlin_python/driver/connection.py", line 77, in _receive
    self._protocol.data_received(data, self._results)
  File "/home/admin-12/.local/lib/python3.6/site-packages/gremlin_python/driver/protocol.py", line 106, in data_received
    "{0}: {1}".format(status_code, data["status"]["message"]))
gremlin_python.driver.protocol.GremlinServerError: 597: None

我是否写错了查询?还是这是一个错误?


版本:Gremlin 3.3.1

【问题讨论】:

  • 这似乎工作 g.V().filter(__.or(has("name", "marko"), has("name", "marko"), has("name", "marko"))) 但我不能这样做 abcd

标签: gremlin tinkerpop3 gremlin-server


【解决方案1】:

我不知道为什么多个 and() 条件不起作用,尽管我认为它们应该起作用,所以我在 JIRA 中为此创建了一个问题:TINKERPOP-2029

这确实有效:

gremlin> g.V().and(filter(has("name", "marko")), filter(has("name", "marko")), filter(has("name", "marko")))
==>v[1]

或更简单地说:

gremlin> g.V().and(has("name", "marko"), has("name", "marko"), has("name", "marko"))
==>v[1]

在您对您所写的问题的评论中,您说您真的想要做abcd - 这种方法似乎是可能的:

gremlin> g.V().or(and(has('name','marko'),has('age',29)),and(has('name','josh'),has('age',32)))
==>v[1]
==>v[4]

或者在这种情况下更简单的是:

gremlin> g.V().or(has('name','marko').has('age',29),has('name','josh').has('age',32))
==>v[1]
==>v[4]

【讨论】:

  • 是的,它的工作原理。罗伯特,在 gremlin 小组中提出了类似的建议。
猜你喜欢
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多