2

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

  1. 我最初计划通过 py2neo 使用 REST Api,但缺少事务有点问题。

  2. “嵌入式数据库”neo4j 似乎不太适合我的情况。我想这在您使用批处理和一次性分析时很有用,并且不需要将数据库存储在与 Web 服务器不同的服务器上。

  3. 我偶然发现了 neo4django 项目,但我不确定这个项目是否提供事务支持(因为没有用于 python 的 neo4j 的本机客户端),以及在 django 本身之外使用它是否会出现问题。事实上,在查看了项目的文档之后,我觉得它有完全相同的限制,也就是没有事务(但是,当你可以在单个连接超时时破坏你的模型时,你怎么能构建一个真实的服务呢?) . 我什至不明白那个项目有什么用。

任何人都可以推荐任何东西吗?我觉得完全被困住了。

谢谢

4

2 回答 2

5

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

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

同意,这种方法本身不会给你交易,但在大多数情况下,它可以给你一个等效的最终结果。在您的应用程序中哪些地方真正需要事务,这当然值得挑战自己。

希望这可以帮助

奈杰尔

于 2012-11-05T14:53:30.160 回答
2

我认为neo4django使用neo4j-rest-client,它确实支持通过Neo4j REST 接口中的batch资源进行事务。

语法与 Neo4j Python 嵌入式 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 文档中找到。

于 2012-11-05T15:19:38.747 回答