在具有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并使用导入实用程序,但我想知道为什么它不能按原样处理。
非常感谢任何帮助/建议。
答案 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个语句。