从正在运行的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
答案 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>