【问题标题】:Neo4j LOAD CSV..when CSV columns contains a list of propertiesNeo4j LOAD CSV ..当 CSV 列包含属性列表时
【发布时间】:2022-11-30 05:10:06
【问题描述】:

这是关于使用 LOAD csv 导入 neo4j csv 的。假设我的 csv 文件格式如下。

Id, OID, name, address, Parents , Children
1, mid1, ratta, hello@aa, ["mid250","mid251","mid253"], ["mid60","mid65"]
2, mid2, butta, ado@bb, ["mid350","mid365","mid320", "mid450","mid700"], ["mid20","mid25","mid30"]
3, mid3, natta, hkk@aa, ["mid50","mid311","mid543"], []

所以父母和孩子列基本上由 mids 组成......同时使用 LOAD CSV 将 csv 导入 neo4j ..我想创建以下节点和关系。

  1. 每行的节点(对于 csv 中的每个 id 列)

  2. [:PARENT] 关系,通过匹配每行中的 OID 属性和父列中的 OID 属性。因此,作为处理第一行的示例...应该有四个节点(mid1、mid250、mid 251 和 mid 253)以及 mid1 和其他 3 个节点之间的 3 PARENT 关系。

  3. [: CHILD ] 关系通过匹配每行中的 OID 属性和子列中的 OID 属性。

    请帮忙!!

    尝试对每个函数执行此操作,但结果不正确。我通过 python 脚本来完成它。只需要编辑密码查询。

    def create_AAA(tx):
        tx.run(
            "LOAD CSV WITH HEADERS FROM 'file:///aaa.csv' AS row MERGE (e:AAA {id: row._id,OID: row.OID,address: row.address,name: row.name})"
        )
    
    def create_parent(tx):
        tx.run(
            "LOAD CSV WITH HEADERS FROM 'file:///aaa.csv' AS row MERGE (a:AAA {OID: row.OID}) FOREACH (t in row.parents | MERGE (e:AAA {OID:t}) MERGE (a)-[:PARENT]->(e) )"
        )
    
    def create_child(tx):
        tx.run(
            "LOAD CSV WITH HEADERS FROM 'file:///aaa.csv' AS row MERGE (a:AAA {OID: row.OID}) FOREACH (t in row.children | MERGE (e:AAA {OID:t}) MERGE (a)-[:CHILD]->(e) )"
        )
    
    with driver.session() as session:
        session.write_transaction(create_AAA)
        session.write_transaction(create_parent)
        session.write_transaction(create_child)
    

【问题讨论】:

  • 你能告诉我们你试过了吗?
  • 是的,当然。我已经编辑了代码。你能检查一下吗。这里的问题是在创建节点时 OID 属性返回为 mid1 ....而在创建关系时 OID 属性是这样的 -> ['mid250']。因此,在创建关系时,它会创建另一个重复节点。

标签: neo4j load-csv


【解决方案1】:

请按照以下说明操作:

  1. 将 Parents 和 Children 的列名称更改为 parents 和 children,因为 neo4j 区分大小写。
  2. 删除 csv 文件中的空格,这样您就不需要对 csv 中的每一列执行 trim ()。
  3. 在您的父母和孩子列中,删除字符串列表中的逗号,因为它会导致错误。或者使用另一个分隔符而不是逗号。在我的示例中,我使用空格作为分隔符。
  4. 下面的脚本将删除引号和 [] 字符,然后将字符串列表转换为列表(使用 split() 函数)
  5. 对创建子函数执行相同的操作。
    LOAD CSV WITH HEADERS FROM 'file:///aaa.csv' AS row 
    MERGE (a:AAA {OID: row.OID}) 
    FOREACH (t in split(replace(replace(replace(row.parents,'[', ''),']', ''),'"', ''), ' ') | 
               MERGE (e:AAA {OID:t}) MERGE (a)-[:PARENT]->(e) )
    

    请在此处查看样本 csv:

    Id,OID,name,address,parents,children
    1,mid1,ratta,hello@aa,["mid250" "mid251" "mid253"],["mid60" "mid65"]
    2,mid2,butta,ado@bb,["mid350" "mid365" "mid320" "mid450" "mid700"],["mid20" "mid25" "mid30"]
    3,mid3,natta,hkk@aa,["mid50" "mid311" "mid543"],[]
    

    在此处查看示例结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2013-07-05
    相关资源
    最近更新 更多