在Neo4J中优化摄取查询

时间:2018-04-27 19:27:53

标签: neo4j cypher

我正在尝试摄取一个包含~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);

1 个答案:

答案 0 :(得分:2)

您需要在查询中添加标签USPolitics,以确保使用您创建的约束中的索引。当然假设nodeAnodeB实际上是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);