从大型、独立的节点和边列表创建图形

Create graph from large, separate list of nodes and edges

neo4j 新手,我想将具有以下结构的 JSON 加载到我的 neo4j 数据库中:

{
  "nodes": [
    {
      "last_update": 1629022369,
      "pub_key": "pub1",
      "alias": "alias1"
    },
    {
      "last_update": 1618162974,
      "pub_key": "pub2",
      "alias": "alias2"
    },
    {
      "last_update": 1634745976,
      "pub_key": "pub3",
      "alias": "alias3"
    }
  ],
  "edges": [
    {
      "node1_pub": "pub1",
      "node2_pub": "pub2",
      "capacity": "37200"
    },
    {

      "node1_pub": "pub2",
      "node2_pub": "pub3",
      "capacity": "37200"
    },
    {
      "node1_pub": "pub3",
      "node2_pub": "pub1",
      "capacity": "37200"
    }
  ]
}

我在单独的查询中加载节点和边:

WITH "file:///graph.json" AS graph
CALL apoc.load.json(graph) YIELD value
FOREACH (nodeObject in value.nodes | CREATE (node:Node {pubKey:nodeObject.pub_key}))
WITH "file:///graph.json" AS graph
CALL apoc.load.json(graph) YIELD value
UNWIND value.edges as edgeObject
MATCH (node1:Node {pubKey: edgeObject.node1_pub})
MATCH (node2:Node {pubKey: edgeObject.node2_pub})
CREATE (node1)-[:IS_CONNECTED {capacity: edgeObject.capacity}]->(node2)

这适用于少量边,但我有一个 ~100mb 的文件,其中有很多边。在后一种情况下,查询不会 return。我是 运行 它来自 neo4j 网络界面。 neo4j 是 运行 in docker 最大堆大小设置为 3g,应该绰绰有余了。

我还没有完全掌握 Cypher 的所有概念,所以可能还有更好的方法。也可能在一次查询中,这样文件就不需要加载两次。

非常感谢!

您可以使用 txBatchSize 参数批量加载 json 文件。请参阅以下文档:

 https://neo4j.com/labs/apoc/4.1/import/load-json/#load-json-available-procedures-apoc.import.json

 WITH "file:///graph.json" as graph
 CALL apoc.load.json(graph, '[0:10000]') YIELD value
 RETURN value

 Where it will return 10000 rows.

好的,在尝试了@jose_bacoy 建议的批处理后,我发现即使是 1000 行也需要大约 20 秒。 显然,MATCH 操作相当 CPU 密集。在我创建索引后,80k 边的导入就像一个魅力。

CREATE INDEX FOR (n:Node) ON (n.pubKey)