OrientDB Gremlin服务器无法在python中运行

时间:2018-05-05 08:59:48

标签: python orientdb gremlin gremlin-server

我在python中使用了orientdb和gremlin服务器,Gremlin服务器已成功启动,但是当我尝试通过gremlin代码向orientdb添加一个顶点时,它给了我一个错误。

query = """graph.addVertex(label, "Test", "title", "abc", "title", "abc")"""

以下是Traceback

/usr/bin/python3.6 /home/admin-12/Documents/bitbucket/ecodrone/ecodrone/test/test1.py
Traceback (most recent call last):
  File "/home/admin-12/Documents/bitbucket/ecodrone/ecodrone/test/test1.py", line 27, in <module>
    result = execute_query("""graph.addVertex(label, "Test", "title", "abc", "title", "abc")""")
  File "/home/admin-12/Documents/bitbucket/ecodrone/ecodrone/GremlinConnector.py", line 21, in execute_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: 599: Error during serialization: Infinite recursion (StackOverflowError) (through reference chain: com.orientechnologies.orient.core.id.ORecordId["record"]->com.orientechnologies.orient.core.record.impl.ODocument["schemaClass"]->com.orientechnologies.orient.core.metadata.schema.OClassImpl["document"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"]->com.orientechnologies.orient.core.record.impl.ODocument["owners"])

Process finished with exit code 1

1 个答案:

答案 0 :(得分:3)

首先,我非常建议您不要使用Graph API进行变异。首选Traversal API并执行:

g.addV('Test').
  property('title1', 'abc').
  property('title2', 'abc')

其次,我认为您的错误正在发生,因为您返回的Vertex包含ORecordId,它是顶点标识符,而Gremlin Server并不知道如何处理它。我不知道OrientDB是否有为处理这个问题而构建的序列化程序,但如果他们这样做,你会想要更详细地描述的add them to Gremlin Server配置here - 基本上,你会想要要知道OrientDB是否为可能通过网络发回的所有自定义类公开了TinkerPop IORegistry

如果他们不这样做,那么你会希望避免返回这些或自己转换它们。 TinkerPop已经建议您不要返回完整的Vertex个对象,只返回您需要的数据。因此,您需要g.V()而不是VertexMap转换为g.V().valueMap('title') project()或类似的东西(可能使用g.V().has("title1","abc").id().next().toString() 步骤)。如果您肯定需要顶点标识符,那么您需要将其转换为TinkerPop序列化程序所理解的内容。这可能意味着一些简单的事情:

(define (tree-insert v t)
  (cond((null? t)(make-tree v '()'()))
   ((eq? v (value t)) t)
   ((< v (value t)) (make-tree (value t)
                               (tree-insert v (left t))
                               (right t)))
   ((> v (value t)) (make-tree (value t)
                               (left t)
                               (tree-insert v (right t))))))