使用python中的neo4J(服务器)与事务

时间:2012-11-05 13:27:42

标签: python flask neo4j py2neo

我目前正在使用python / flask构建一个Web服务,并希望在neo4j之上构建我的数据层,因为我的核心数据结构本身就是一个图形。 我对neo4j为这种情况提供的不同技术感到有些困惑。特别是:

1 / i最初计划使用REST Api到py2neo,但缺少事务是一个问题。

2 /“嵌入式数据库”neo4j似乎不太适合我的情况。我认为当您使用批量和一次性分析时,它非常有用,并且不需要将数据库存储在与Web服务器不同的服务器上。

3 /我偶然发现了neo4django项目,但我不确定这个提供事务支持(因为没有本地客户端到neo4j for python),如果在django之外使用它会有问题本身。事实上,在查看了项目的文档之后,我觉得它有完全相同的限制,即没有事务(但是,当你在单个连接超时时可以破坏你的模型时,如何构建真实世界的服务?) 。我甚至不明白该项目的用途。

有人可以推荐什么吗?我觉得完全卡住了。

由于

2 个答案:

答案 0 :(得分:5)

任何REST API客户端都无法显式支持(正确)事务,因为Neo4j REST API接口无法提供该功能。有一些替代方案,例如Cypher查询和批处理执行,它们都在服务器端的单个原子事务中运行;但是,我对客户端应用程序的一般方法是尝试构建可以优雅地处理部分完整数据的代码,从而无需显式事务控制。

通常,这种方法会大量使用唯一索引,这也是我在py2neo中提供了大量“get_or_create”类型方法的原因之一。 Cypher本身非常强大,并且还提供了唯一性功能,特别是通过CREATE UNIQUE子句。使用这些,您可以使您的写入具有幂等性,并且您可以在“不止一次”这样做的过程中犯错误,因为您不会最终获得重复数据。

同意,这种方法本身并不能为您提供交易,但在大多数情况下,它可以为您提供相同的最终结果。对于您的应用程序事务中真正必要的位置来说,当然值得挑战自己。

希望这有帮助

答案 1 :(得分:2)

我认为neo4django使用neo4j-rest-client,它通过Neo4j REST界面中的batch resource支持交易。

语法与Neo4j Python emebedded API使用的语法非常相似:

>>> n = gdb.nodes.create()

>>> n["age"] = 25

>>> n["place"] = "Houston"

>>> n.properties
{'age': 25, 'place': 'Houston'}

>>> with gdb.transaction():
   ....:         n.delete("age")
   ....:

>>> n.properties
{u'place': u'Houston'}

有关transactions的neo4j-rest-client文档中可以找到更多信息。