我正在尝试摄取一个包含~100个节点的图表,但是带有时间戳的~10K关系。
经过一番研究,我使用了批量交易&能够在我的本地机器(localhost)上使用UNWIND将摄取时间从6分钟降低到40秒
但是,当我将10K关系的相同批处理事务发送到不同的服务器时,它需要超过3分钟。
我可以使用哪些策略来减少远程服务器上neo4j的摄取时间? (我之前托管远程服务器的原因是将neo4j执行周期从我的电脑中分离出来,这需要为我的应用程序执行大量的nlp任务,服务器在我的局域网上;我是唯一使用ip连接到它的用户地址)。
我的摄取查询在这里:
result = cypher.query("CREATE CONSTRAINT ON (n:USPolitics) ASSERT n.id IS UNIQUE",map());
parameters = createrelations();
result = cypher.query(
"UNWIND {batches} as batch " +
"MATCH (nodeA {id: batch.nodeA})"+
"MATCH (nodeB {id: batch.nodeB})"+
"MERGE (nodeA)-[rel:KNOWS]->(nodeB)" +
"ON CREATE SET rel+=batch.properties " +
"RETURN 1", parameters);
答案 0 :(得分:2)
您需要在查询中添加标签USPolitics
,以确保使用您创建的约束中的索引。当然假设nodeA
和nodeB
实际上是USPolitics
个节点。
result = cypher.query("CREATE CONSTRAINT ON (n:USPolitics) ASSERT n.id IS UNIQUE",map());
parameters = createrelations();
result = cypher.query(
"UNWIND {batches} as batch " +
"MATCH (nodeA:USPolitics {id: batch.nodeA})"+
"MATCH (nodeB:USPolitics {id: batch.nodeB})"+
"MERGE (nodeA)-[rel:KNOWS]->(nodeB)" +
"ON CREATE SET rel+=batch.properties " +
"RETURN 1", parameters);