Neo4j导入工具和查询

时间:2016-01-14 16:02:17

标签: indexing neo4j

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

1 个答案:

答案 0 :(得分:0)

  

这个节点索引是什么?实际使用在哪里?

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

Read up on indexes in neo4j

  

这个索引是什么?实际使用的是什么?

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

索引都是关于交易计算时间和存储以获得更好的性能。基本上,数据库以某种方式预先订购所有节点(这会花费你的前期计算时间,并且还会占用磁盘上的少量存储空间),以换取具有良好的数据结构,使查询速度非常快。通常在数据库术语中,您会发现如果您执行大量只读查询(获取数据),您确实需要索引。如果你的工作量主要只是添加东西(而不是查找),那么它们就不那么好了。

  

运行cypher查询并未显示该索引正在任何地方使用。

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

  

我理解在运行cypher查询时,结果存储在堆

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

  

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

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

  

neo4j会切换到磁盘吗?

否 - 如果/当发生任何交换到磁盘时,在任何情况下都是操作系统决定处理您的主内存。它可能会发生,但这与neo4j没什么关系。

  

或者会产生错误

不,neo4j并不关心你的结果有多大。使用“光标”概念,您可以获得1个结果或100亿个结果,两者都可以。