【问题标题】:Neo4j import tool and queryingNeo4j 导入工具及查询
【发布时间】:2016-04-20 01:05:54
【问题描述】:

我有一些与 neo4j 功能相关的非常基本的概念性问题。 1.第一个问题是关于导入工具的。我正在导入大约 1.5 亿个节点和类似数量的关系。当我上传时,命令终端上的输出会打印上传的节点数,然后准备节点索引。这个节点索引是什么?它实际用在哪里?我看到创建的索引信息存在于 graph_db=>schema=>label 中。这个索引是什么,它实际在哪里使用?运行密码查询并不表明索引正在任何地方使用。 2.第二个问题是关于neo4j的堆内存大小。我的理解是,在运行密码查询时,结果存储在堆中。一旦堆满,就会发生垃圾回收。如果我运行 cypher 语句产生的结果不能保存在堆中,即查询结果大于堆大小怎么办。 neo4j 会切换到磁盘吗?还是会产生错误。 感谢您提前解决这些问题。 最好的,

【问题讨论】:

    标签: indexing neo4j


    【解决方案1】:

    这个节点索引是什么?实际用在什么地方?

    索引就是这样 - 一个数据库索引。数据库索引用于帮助您快速查找节点。假设您将 100 万个 :Person 节点放入数据库,然后将 100 万个 :Location 节点放入数据库中。当您 MATCH (p:Person { last_name: "Smith" } 时,您希望数据库仅搜索 :Person 节点,而不是全部 200 万个节点。索引是实现这一目标的原因。

    Read up on indexes in neo4j

    这个索引是什么,实际用在什么地方?

    按标签索引基本上是按标签分类的节点的可搜索集合(在本例中为:Person:Location),数据库引擎使用这些标签来加快查找速度。这是一个大大简化的答案,但基本上是准确的。这是一件非常好的事情,你肯定想要它。没有它,从数据库中获取数据的性能会很差。

    索引都是关于交易计算时间和存储以获得更好的性能。基本上,数据库以某种方式对所有节点进行预排序(这会花费您的前期计算时间,并且还会占用少量磁盘存储空间),以换取良好的数据结构,从而使查询非常快速.一般来说,在数据库方面,您会发现如果您执行大量只读查询(获取数据),您真的非常需要索引。如果您的工作量主要只是添加内容(而不是查找),那么它们就没有那么好了。

    运行密码查询并不表明索引正在任何地方使用。

    是的,它是不可见的,但是当您使用标签在 Cypher 中搜索某些内容时,neo4j 正在利用该索引。它可能是不可见的,但用于优化您的查询。

    我的理解是,在运行密码查询时,结果存储在堆中

    这只是部分正确;在某种意义上,java 中的所有内容都存储在堆中。但是结果从数据库中流出。如果您发出一个产生 100 万个结果的查询,并不是所有 100 万个结果都立即进入堆。它们一次被拉成块(我不知道一次有多少,数据库引擎会处理)。在任何给定时间,堆中的内容都是您现在需要的集合,而不是所有内容。

    如果我运行的 cypher 语句产生的结果无法保存在堆中,即查询结果大于堆大小,该怎么办?

    请参阅前面的答案。您可以毫无问题地执行此操作,因为整个集合通常不在堆中。用数据库术语来说,我们会说你得到一个“光标”,它可以让你遍历结果。您确实不会获得巨大的结果集。这里的问题是,如果你有 100 万个结果,你可以遍历它们一次。需要第二次通过它们吗?避免这样做,或再次发出查询。

    neo4j 会切换到磁盘吗?

    否 - 如果/当任何交换到磁盘发生时,无论如何这将是操作系统决定处理您的主内存。有可能会发生,但这与 neo4j 没有太大关系。

    或者它会产生错误

    不,neo4j 不在乎你的结果集有多大。使用“游标”概念,您可以获得 1 个结果或 100 亿个结果,两者都可以。

    【讨论】:

    • 非常感谢所有这些答案。我通过测试弄清楚了一些。对于堆测试,运行一个大查询并达到堆内存错误。还通过创建索引进行了一些测试。
    猜你喜欢
    • 2016-08-23
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多