获取所有Neo4j节点和关系的最快方法?

时间:2014-06-23 16:02:50

标签: performance neo4j dump

从正在运行的Neo4j 2.x服务器获取所有无序节点和关系到程序的最快方法是什么?

Cypher MATCH n RETURN n对我的用例来说太慢了(比如我们要提取> 10M节点)。

shell命令dump似乎很有趣,但它需要一些黑客从源代码调用。是否有dump的基准?

任何建议都赞赏!

- 编辑 -

我使用类似MATCH n RETURN n SKPI 0 LIMIT 50000的查询执行查询,考虑本地Neo4j服务器的REST端点(因此没有网络效应)。我的db是Neo4j 2.0.3,填充了1个整数属性的100k节点,没有任何关系。计算机:SSD读取速度为1.3+ Mo / s,CPU i7 1.6Ghz,JVM -Xmx2g。检索50k节点需要大约4s:

curl -s -w %{time_total} -d"query=match n return n limit 50000" -D- -onul: http://localhost:7474/db/data/cypher

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Access-Control-Allow-Origin: *
Content-Length: 63394503
Server: Jetty(9.0.z-SNAPSHOT)

4,047

2 个答案:

答案 0 :(得分:2)

获取所有节点的最快方法是运行Neo4j嵌入式。您通过Cypher使用REST API看到的性能下降主要是由于网络上的数据传输限制。

使用方法getAllNodes,您可以检索图表中的所有节点,而无需通过网络传输数据。

http://api.neo4j.org/current/org/neo4j/tooling/GlobalGraphOperations.html

try ( Transaction tx = db.beginTx(); ) {
    Iterable<Node> allNodes = db.getAllNodes();
    tx.success();
}

请注意,自2.1.2起,此方法现已弃用。

要了解有关Neo4j embedded的更多信息,请查看文档。

http://docs.neo4j.org/chunked/stable/tutorials-java-embedded.html

答案 1 :(得分:1)

你想要的是enable HTTP chunked encoding(又名Steaming)让Neo4j开始向你发送结果而不将它们全部留在内存中。 您可以通过添加Accept: application/json;stream=true HTTP请求标头来执行此操作。

这个请求可以解决问题:

curl -i -o streamed.txt -XPOST \
  -d'{ "query":"MATCH n RETURN n" }' \
  -H 'accept:application/json;stream=true' \
  -H 'content-type:application/json' \
  'http://localhost:7474/db/data/cypher'

另外,如果您想在收到整个内容之前开始解析您的响应(以避免填满内存/硬盘),您可能需要查看JSON stream parsing。< / p>