【问题标题】:Choice between REST API or Java APIREST API 或 Java API 之间的选择
【发布时间】:2013-02-11 13:14:54
【问题描述】:

最近几天我一直在阅读有关 Neo4j 的信息。我对是否需要使用 REST API 或者是否可以使用 Java API 感到非常困惑。

  1. 我需要创建数以百万计的节点,它们之间会有一些联系。我想在几个节点属性上添加索引以进行搜索。最初我从带有 Java API 的 GraphDB 嵌入式模式开始,但很快就在几个节点上建立了索引OutOfMemory,所以我认为如果我的 neo4j 作为服务运行并通过 REST API 连接到它会更好,然后它将完成所有内存通过将数据输入/输出到底层文件来自行管理。我的假设对吗?

  2. 此外,我计划将我的解决方案扩展到数十亿个节点,我相信单机安装 neo4j 是不可能的。我也相信 Neo4j 有能力在分布式模式下运行。出于这个原因,我也认为继续 REST API 实现是最好的主意。 虽然我找不到任何关于如何在分布式环境中运行 Neo4j 的好的文档。

  3. 我是否也可以使用 REST API 执行批量插入等操作,而我可以使用 Java API 以及在嵌入式模式下运行的 Graph DB 执行这些操作?

【问题讨论】:

    标签: java api rest scalability neo4j


    【解决方案1】:
    1. 您知道为什么会收到OutOfMemory 异常吗?这听起来就像您在同一个事务中创建所有这些节点,这导致它存在于内存中。尝试一次提交小块,以便Neo4j 可以将其写入磁盘。除了缓存之类的东西,您不必管理 Neo4j 的内存。

    2. 分布式模式采用主/从架构,因此您仍将在每个系统上拥有整个数据库的副本。 Neo4j 对于磁盘存储非常有效,一个节点占用 9 个字节,关系占用 33 个字节,属性是可变的。

    3. 有一个 Batch REST API,它将许多调用组合到同一个 HTTP 调用中,但是如果嵌入了 REST 调用,它仍然会更慢。

    使用 REST API 有一些您没有提到的缺点,这就是事务之类的东西。如果您要执行原子操作,您需要创建多个节点、关系、更改属性,并且如果任何步骤失败不提交任何步骤,则无法在 REST API 中执行此操作。

    【讨论】:

    • REST 来说,您可以通过处理文档的 POST 来告诉系统要做什么(POST,因为它不是幂等的)来执行复杂的操作。但是,除非您对各种事物的描述性元数据进行大量额外工作,否则此类机制的可发现性并不是很好。
    • 是的,我不是在抨击RESTful 网络服务,而是Neo4j 不允许跨多个REST 调用的事务。
    • 您确定在集群中运行时,所有实例都包含相同的数据吗?我想我读到了一个分布,其中实例只是在它们之间共享一部分数据,但不是全部。
    • 谢谢大家! 1.“这听起来像是您在同一个事务中创建所有这些节点,这导致它存在于内存中。”我会检查一下。但我的感觉是,当我尝试将节点添加到基于节点的各种属性创建的索引时,我面临 OOM。就我而言,我有 50 多个要搜索的属性,因此将它们全部添加到索引中。
    • 2.从您的评论看来,它保留副本是为了实现负载平衡,以提高查询性能,而不是在存储方面进行可扩展。但是当我询问分布式模式时,我需要在存储方面对其进行扩展。我很欣赏有关节点/关系大小的信息,但在某些时候它仍然是一个限制因素。 Mine 是一种数据仓库系统,我们在其中不断添加每日/每月数据,同时仍想保留旧数据。这个问题仍然悬而未决,也是我需要将 REST API 仅用于分布式模式的固有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多