这个节点索引是什么?实际用在什么地方?
索引就是这样 - 一个数据库索引。数据库索引用于帮助您快速查找节点。假设您将 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 亿个结果,两者都可以。