【问题标题】:What is the fastest way to import to Neo4j?导入 Neo4j 的最快方法是什么?
【发布时间】:2015-12-06 14:29:01
【问题描述】:

我有一个 JSON 文档列表,格式为:

[{a:1, b:[2,5,6]}, {a:2, b:[1,3,5]}, ...]

我需要做的是使用参数a 创建节点,并将它们连接到列表b 中具有a 值的所有节点。所以第一个节点将连接到节点 2、5 和 6。现在我正在使用 Python 的 neo4jrestclient 进行填充,但这需要很长时间。有没有更快的填充方式?

目前这是我的脚本:

break_list = []
for each in ans[1:]:
    ref = each[0]
    q = """MATCH n WHERE n.url = '%s' RETURN n;""" %(ref)
    n1 = gdb.query(q, returns=client.Node)[0][0]
    for link in each[6]:
        if len(link)>4:
            text,link = link.split('!__!')
            q2 = """MATCH n WHERE n.url = '%s' RETURN n;""" %(link)
            try:
                n2 = gdb.query(q2, returns=client.Node)
                n1.relationships.create("Links", n2[0][0], anchor_text=text)
            except:
                break_list.append((ref,link))

【问题讨论】:

  • 你试过py2neo吗?
  • 为什么会更快?
  • 为什么人们不赞成这个?对我来说,这似乎是一个有效的问题。使用当前技术填充 100,000 个节点需要几天时间。

标签: python neo4j


【解决方案1】:

您可能需要考虑将您的 JSON 转换为 CSV(使用类似 jq),然后您可以使用 LOAD CSV Cypher 工具进行导入。 LOAD CSV 针对数据导入进行了优化,因此使用此方法您将获得更好的性能。在您的示例中,LOAD CSV 脚​​本看起来像这样:

您的 JSON 已转换为 CSV:

"a","b"
"1","2,5,6"
"2","1,3,5"

首先创建唯一性约束/索引。这将确保只为任何“名称”创建一个节点,并创建一个索引以提高查找性能。

CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE;

鉴于上述 CSV 文件,此 Cypher 脚本可用于有效导入数据:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///path/to/file.csv" AS row
MERGE (a:Person{name: row.a})
WITH a,row
UNWIND split(row.b,',') AS other
MERGE (b:Person {name:other})
CREATE UNIQUE (a)-[:CONNECTED_TO]->(b);

其他选项

另一种选择是在 Cypher 查询中使用 JSON 作为参数,然后使用 UNWIND 遍历 JSON 数组的每个元素。

WITH {d} AS json
UNWIND json AS doc
MERGE (a:Person{name: doc.a})
WITH doc, a
UNWIND doc.b AS other
MERGE (b:Person{name:other})
CREATE UNIQUE (a)-[:CONNECTED_TO]->(b); 

虽然非常大的 JSON 数组可能存在一些性能问题。查看herehere 的一些示例。

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多