在 neo4J 中导入 json

[问题 — — 以下是我的最终解决方案]

我想把包含我的数据的json文件导入Neo4J,但是速度超慢。

Json文件的结构如下

{
    "graph": {
        "nodes": [
            { "id": 3510982, "labels": ["XXX"], "properties": { ... } },
            { "id": 3510983, "labels": ["XYY"], "properties": { ... } },
            { "id": 3510984, "labels": ["XZZ"], "properties": { ... } },
     ...
        ],
        "relationships": [
            { "type": "bla", "startNode": 3510983, "endNode": 3510982, "properties": {} },
            { "type": "bla", "startNode": 3510984, "endNode": 3510982, "properties": {} },
    ....
        ]
    }
}

是和这里提出的类似。如何在浏览器中恢复以前的结果数据?.

通过查看答案,我发现我可以使用

CALL apoc.load.json("file:///test.json") YIELD value AS row
WITH row, row.graph.nodes AS nodes
UNWIND nodes AS node
CALL apoc.create.node(node.labels, node.properties) YIELD node AS n
SET n.id = node.id

然后

CALL apoc.load.json("file:///test.json") YIELD value AS row
with row
UNWIND row.graph.relationships AS rel
MATCH (a) WHERE a.id = rel.endNode
MATCH (b) WHERE b.id = rel.startNode
CALL apoc.create.relationship(a, rel.type, rel.properties, b) YIELD rel AS r
return *

(我必须分两次做,否则他们的关系会重复,因为两个 unwind).

但这是超级慢的,因为我有很多实体,我怀疑程序要在所有实体上搜索每个关系。

同时,我知道 "startNode": 3510983 所以问题是:是否存在使用id作为索引来加快导入过程的方法,或者其他方法?

请注意,我的节点有不同的类型,所以我没有找到为所有节点创建索引的方法。所以我没有找到为所有节点创建索引的方法,我想那会太大(内存)。

[我的解决方案]

CALL apoc.load.json('file:///test.json') YIELD value
WITH value.graph.nodes AS nodes, value.graph.relationships AS rels
UNWIND nodes AS n
CALL apoc.create.node(n.labels, apoc.map.setKey(n.properties, 'id', n.id)) YIELD node
WITH rels, COLLECT({id: n.id, node: node, labels:labels(node)}) AS nMap
UNWIND rels AS r
MATCH (w{id:r.startNode})
MATCH (y{id:r.endNode})
CALL apoc.create.relationship(w, r.type, r.properties, y) YIELD rel
RETURN rel

解决方案:

[已编辑]

这种方法 更有效地工作。

CALL apoc.load.json("file:///test.json") YIELD value
WITH value.graph.nodes AS nodes, value.graph.relationships AS rels
UNWIND nodes AS n
CALL apoc.create.node(n.labels, apoc.map.setKey(n.properties, 'id', n.id)) YIELD node
WITH rels, apoc.map.mergeList(COLLECT({id: n.id, node: node})) AS nMap
UNWIND rels AS r
CALL apoc.create.relationship(nMap[r.startNode], r.type, r.properties, nMap[r.endNode]) YIELD rel
RETURN rel

这个查询不使用 MATCH (而且不需要索引),因为它只是依赖于从导入的节点id到创建的节点的内存映射。然而,这个查询 可以 如果有很多导入的节点,就会耗尽内存。

这也避免了调用 SET 借用 apoc.map.setKey 添加 id 属性为 n.properties.

2 UNWINDs不会引起卡提斯积,因为这个查询使用了 聚合函数 COLLECT (第二轮之前) UNWIND)将前面所有的行压缩成一条(因为分组键。rels,是一个单子)。)

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何使用取消链接删除.DS_Store?

2022-9-13 13:34:39

未分类

如何在R中把0和1的数据表绘制成双色网格?

2022-9-13 13:34:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索