从大型、独立的节点和边列表创建图形
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)
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)