Neo4j事务变慢,然后使用python抛出异常



在16GB RAM, i7 cpu和ssd驱动器的windows 10机器上运行Neo 2.2.5。我正在转换一个mssql应用程序python3.5/neo。我正在连接py2neo(2.0.8)。我正试图从web api运行批量加载。我正在调出200条记录,并将它们批量输入尼奥。前两个批以每秒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并使用导入实用程序,但我想知道为什么它不能这样处理。

我认为你遇到了一个问题,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发布时使用它进行测试。

我似乎遇到了'急切'的问题,解释如下:Mark Needham’s post Neo4j: Cypher - avoid the Eager

我将关系从节点中分离出来,性能跃升到每秒处理6000条语句。

最新更新