neo4j事务放慢然后使用python抛出异常

时间:2015-10-12 00:13:01

标签: python-3.x neo4j

在具有16GB RAM,i7 cpu和ssd驱动器的Windows 10计算机上运行Neo 2.2.5。我正在将mssql应用程序转换为python3.5 / neo。我正在连接py2neo(2.0.8)。我正在尝试从web api运行批量加载。我正在提取200条记录并将它们分配到Neo中。前几批批次的加载速度为每秒2100条。 15分钟后,速率一直低于300 / s。

我的代码非常简单:

graph = Graph("http://127.0.0.1:7474/db/data/")
graph.cypher.execute("CREATE CONSTRAINT ON (d:Document) ASSERT d.id IS UNIQUE")
graph.cypher.execute("CREATE CONSTRAINT ON (k:Keyword) ASSERT k.ui IS UNIQUE")
graph.cypher.execute("CREATE CONSTRAINT ON (c:Chemical) ASSERT c.ui IS UNIQUE")

然后我循环完成以下陈述

"MERGE (d:Document {id: {ID}}) ON CREATE SET d.name={NAME}, d.created={CR}, d.abstract={AB}"
"MERGE (k:Keyword  {ui: {ID}}) ON CREATE SET k.word={WORD}"
"MERGE (c:Chemical {ui: {ID}}) ON CREATE SET c.name={NAME}"
'MATCH (d:Document {id: {ID}}), (k:Keyword {ui: {UID}}) \
 MERGE (d)-[r:HAS_TOPIC]->(k)'
'MATCH (d:Document {id: {ID}}), (c:Chemical {ui: {UID}}) \
 MERGE (d)-[r:INCLUDES]->(c)'

我在这个循环的200次迭代后提交。 一开始我运行tx = graph.cypher.begin() 在200个循环后,我运行tx.commit()

如果我在一次提交后退出程序,则数据库包含所有数据,一切看起来都很好。当我让它运行时,问题就开始了。

每个tx.commit()花费的时间比前一个长,最终我得到套接字超时错误。对于neo-community.exe,CPU永远不会超过12%。我将default.graphdb目录排除在防病毒之外,并且计算机上没有其他任何内容正在运行。

我尝试了各种vmoptions,最后一个是:

-d64
-server
-Xmx2G

有一次退出:

py2neo.cypher.error.request.InvalidFormat: Unable to deserialize request: Unexpected character ('s' (code 115)): was expecting comma to separate OBJECT entries at [Source: HttpInputOverHTTP@4440958a; line: 1, column: 679940]

其他时候它会超过这一点并在几分钟后退出并发生套接字超时错误。

我知道我可以批量导出到csv并使用导入实用程序,但我想知道为什么它不能按原样处理。

非常感谢任何帮助/建议。

2 个答案:

答案 0 :(得分:0)

我认为你遇到了Cypher从错误的方面合并你的关系的问题。在2.2中,它有时候并不那么聪明。

目前,对于这两种关系,订单如下:

MATCH (d:Document {id: {ID}}), (k:Keyword {ui: {UID}}) 
MERGE (d)-[r:HAS_TOPIC]->(k)

(k)<-[:HAS_TOPIC]-(d)

MATCH (d:Document {id: {ID}}), (c:Chemical {ui: {UID}}) 
MERGE (d)-[r:INCLUDES]->(c)

(d)-[:INCLUDES]->(c)

因此,如果第一种情况下的关键字或第二种情况下的文档节点有很多关系(或多于另一方的关系),那么将需要更长时间。

您可以通过更改标识符来解决此问题,例如:到(a)-->(b)

左侧的那个总是的关系更少(或者还没有)。

在2.3中,它会更加聪明。你很快就想用RC来测试它。

答案 1 :(得分:0)

似乎我遇到了渴望的&#39;问题解释如下: Mark Needham's post Neo4j: Cypher – Avoiding the Eager

我将关系与节点分开,性能跳跃到每秒处理6000个语句。