Проблема TinkerPop с использованием нескольких фильтров и / или - PullRequest
0 голосов
/ 04 сентября 2018

Я фильтровал несколько свойств и выбирал узел, поэтому, если было несколько filter, соединенных с and и or. 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

1 Ответ

0 голосов
/ 05 сентября 2018

Я не знаю, почему несколько 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]
...