代码之家  ›  专栏  ›  技术社区  ›  Srinath Ganesh

使用和/或多个过滤器的TinkerTop问题

  •  1
  • Srinath Ganesh  · 技术社区  · 7 年前

    我过滤了多个属性并获取了一个节点,所以如果有多个 filter 加入 and or 。2工作正常,但从3号开始似乎就崩溃了。

    下面是错误的简化演示。

    滤波器

    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]
    

    没有 滤波器

    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并使用时 滤波器 它把我扔了

    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

    1 回复  |  直到 7 年前
        1
  •  2
  •   stephen mallette    7 年前

    我不知道为什么是多重的 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]
    

    在你对你写的你真正想做的问题的评论中 a b c d -这种方法似乎是可行的:

    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]