【问题标题】:GrapheneDB Cypher transactions with py2neo使用 py2neo 的 GrapheneDB Cypher 事务
【发布时间】:2014-10-06 20:41:32
【问题描述】:

我正在使用 GrapheneDB、Tornado、py2neo 在 Heroku 上运行应用程序。

我正在尝试使用 py2neo 的 Cypher 交易。

我可以在本地运行:

graphenedb_url = os.environ.get("GRAPHENEDB_URL", "http://localhost:7474/")
service_root = neo4j.ServiceRoot(URI(graphenedb_url).resolve("/"))
graph_db = service_root.graph_db
session = cypher.Session()

但是当我部署到 Heroku 时,我得到:

2014-10-06T20:33:34.626356+00:00 app[web.1]:   File "main.py", line 33, in <module>
2014-10-06T20:33:34.626364+00:00 app[web.1]:     session = cypher.Session()
2014-10-06T20:33:34.626367+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/py2neo/cypher.py", line 127, in __init__
2014-10-06T20:33:34.626435+00:00 app[web.1]:     self._graph_db = self._service_root.graph_db
2014-10-06T20:33:34.626456+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/py2neo/neo4j.py", line 462, in graph_db
2014-10-06T20:33:34.626550+00:00 app[web.1]:     return GraphDatabaseService.get_instance(self.__metadata__["data"])
2014-10-06T20:33:34.626571+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/py2neo/neo4j.py", line 338, in __metadata__
2014-10-06T20:33:34.626641+00:00 app[web.1]:     self.refresh()
2014-10-06T20:33:34.626662+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/py2neo/neo4j.py", line 360, in refresh
2014-10-06T20:33:34.626732+00:00 app[web.1]:     self._metadata = ResourceMetadata(self._get().content)
2014-10-06T20:33:34.626756+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/py2neo/neo4j.py", line 365, in _get
2014-10-06T20:33:34.626838+00:00 app[web.1]:     product=self._product)
2014-10-06T20:33:34.626842+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/py2neo/packages/httpstream/http.py", line 803, in get
2014-10-06T20:33:34.627276+00:00 app[web.1]:     return rq.submit(redirect_limit=redirect_limit, **kwargs)
2014-10-06T20:33:34.627279+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/py2neo/packages/httpstream/http.py", line 388, in submit
2014-10-06T20:33:34.627281+00:00 app[web.1]:     http, rs = submit(self.method, uri, self.body, headers)
2014-10-06T20:33:34.627282+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/py2neo/packages/httpstream/http.py", line 328, in submit
2014-10-06T20:33:34.627288+00:00 app[web.1]:     raise SocketError(code, description, host_port=uri.host_port)
2014-10-06T20:33:34.627290+00:00 app[web.1]: py2neo.packages.httpstream.http.SocketError: Connection refused
2014-10-06T20:33:34.626336+00:00 app[web.1]: Traceback (most recent call last):
2014-10-06T20:33:35.495790+00:00 heroku[web.1]: Process exited with status 1
2014-10-06T20:33:35.505975+00:00 heroku[web.1]: State changed from starting to crashed

我也试过了:

session = cypher.Session(URI(graphenedb_url).resolve("/"))

但这甚至在本地都行不通。我试过浏览 Graphene Docs,但没有运气。

有什么建议吗?

更新: 如果我这样做:

session = cypher.Session(os.environ.get("GRAPHENEDB_URL"))
tx = session.create_transaction()
tx.append("MATCH n RETURN n") 
results = tx.execute()
for r in results[0]:
      r.values[0]

我明白了:

Node('http://localhost:0/db/data/node/40')
Node('http://localhost:0/db/data/node/41')
Node('http://localhost:0/db/data/node/42')

我猜端口应该是 7474 而不是 0? 或者不应该是 Node('GRAPHENEDB_URI/db/data/node/40') 而不是 localhost?

【问题讨论】:

  • 您确定指向 /db/data/ 端点吗?您的默认值应为“localhost:7474/db/data”,对于您的 GrapheneDB 网址也是如此。
  • 所以我尝试了cypher.Session(os.environ.get("GRAPHENEDB_URL")) 并在执行后尝试通过事务循环后出现另一个错误:SocketError: Can't assign requested address 让我尝试通过控制台查看是否有其他问题部分代码。
  • 我是来自 GapheneDB 的 Alberto。您使用的是哪个版本的 Neo4j?您能否检查一下在没有交易的情况下是否也会发生这种情况?
  • 嗨 Alberto,我有:graph.neo4j_version &gt; (2, 1, 3, u'') 我能够执行批处理:我在日志中得到了200 OK 和正确的 URI。
  • Alberto,经过进一步调查,我更新了我的问题。

标签: neo4j py2neo


【解决方案1】:

这是bug in Neo4j。事务提交 URL 的问题在 2.1.5 中已修复,但节点的 URL 仍然错误。

我已更新问题并重新打开。

AFAIK 它只影响事务端点,所以 REST 接口的其他端点应该没问题。

我能想到的唯一解决方法是在 Py2neo 中使用 URL 重写,如 documented here

我希望这个问题能尽快得到解决,非常抱歉,我没有其他办法让您解决这个问题。

【讨论】:

  • 谢谢阿尔贝托。我检查了 Graphene DB 仪表板,发现 GrapheneDB 已经在使用 2.1.5“Neo4j Community Edition 2.1.5”,当我尝试访问节点时仍然出现错误。我的意思是,我也可以这样做:for r in results[0]: r.values[0].__uri__._URI__set_host("graphenedbURL.com/"),但它有点脏。
  • 但是您是否创建了一个新数据库?我们添加了对 2.1.5 的支持,但除非您尚未移动到新实例,否则您的实例仍将在 2.1.3 上。你能确认一下吗?
  • 我删除了插件,然后重新添加了它:heroku addons:add graphenedb:chalk --version v215,加载数据成功(我可以在“Neo4j Web Admin interface”中看到它,它显示v2.1.5),但是当我尝试了 cypher.Session,它仍然会出现与上述相同的错误。很抱歉成为一个痛苦的人。一定是我做错了什么。
  • 我已经能够重现该问题。一旦我们修复它,我将调查并更新答案。感谢您的帮助。
  • 我现在有什么办法可以解决这个问题吗?建议?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多