【问题标题】:using neo4J (server) from python with transaction使用来自python的neo4J(服务器)和事务
【发布时间】:2012-11-05 13:27:41
【问题描述】:

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

  1. 我原本打算通过 py2neo 使用 REST Api,但是缺少事务有点问题。

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

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

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

谢谢

【问题讨论】:

    标签: python flask neo4j py2neo


    【解决方案1】:

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

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

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

    希望对你有帮助

    奈杰尔

    【讨论】:

      【解决方案2】:

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

      语法与 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 文档。

      【讨论】:

        猜你喜欢
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多