【问题标题】:Neo4j merge properties from a text fileNeo4j 合并文本文件中的属性
【发布时间】:2018-06-15 12:00:57
【问题描述】:

是否可以将文本文件中的属性与 neo4j 中的现有节点合并?我的文本文件是 id, property 的形式。 id 与我在 neo4j 中已有的节点匹配。我正在尝试将所有具有 id 的节点类型与文本文件的 id 匹配并添加新属性。我现在尝试了这个,但它需要很长时间才能完成。此外,我可以在所有节点上执行此操作,而不仅仅是在 Songs 节点上 - 我只是将其保留为 MATCH (c)?

USING PERIODIC COMMIT 500
LOAD CSV FROM 'file:///page_rank.txt' AS  line 
MATCH (c:Songs)
WHERE c.id=toInt(line[0]) 
SET c.pageRank = toFloat(line[1])

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    是的,这是可能的。

    假设我的数据库中有四个现有节点:

    (a:Person {id: 01})
    
    (b:Person {id: 02})
    
    (c:Person {id: 03})
    
    (d:Dog {id: 04})
    

    假设我想在它们上合并一些属性 - 我不想创建新节点 - 只需将这些属性添加到现有节点即可。

    所以我有一个名为“nodes_prop.csv”的 CSV 文件,如下所示:

    id,property
    01,blue
    02,green
    03,grey
    04,black
    

    如果我想使用合并(在我看来,您可能只使用 MATCH - SET 就可以逃脱)来匹配节点的 id 并设置属性(基于 CSV 文件中的值),无论节点的标签如何,我都可以使用以下密码查询:

    LOAD CSV WITH HEADERS FROM "file:///nodes_prop.csv" AS line
    MERGE (a {id: toInteger(line.id)})
    ON MATCH SET a.eye_color=line.property
    RETURN *;
    

    【讨论】:

      【解决方案2】:

      它“永远完成”的可能原因是您在:Song(id) 上没有an index,因此MATCH/WHERE 子句必须扫描Song 节点以找到每个id .

      你可以这样创建你需要的索引:

      CREATE INDEX ON :Song(id)
      

      但是,如果您想进行基本相同的查询,但对于所有节点(不仅仅是Song 节点),您将无法使用“正常”索引,如上所述。相反,为了获得良好的性能,您需要使用 explicit indexes,这需要您付出更多努力才能使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        • 2012-06-23
        相关资源
        最近更新 更多