【问题标题】:Creating relationship with already existing node与现有节点创建关系
【发布时间】:2015-07-04 12:06:53
【问题描述】:

我正在使用 here 中描述的 py2neo 的 csv 批量导入将 rdb 转换为 neo4j。我这样组织代码:

delivery = "Delivery.csv"
graph = Graph("http://localhost:7474/db/data/")
graph.cypher.execute("CREATE CONSTRAINT ON (delivery:Delivery) ASSERT delivery.name IS UNIQUE")
with open(delivery, 'r+') as in_file:

    reader = csv.reader(in_file, delimiter=';')
    next(reader, None)
    batch = graph.cypher.begin()

    try:
        i = 0;
        j = 0;
        for row in reader:
            if row:
                name = strip(row[0])
                created_by = strip(row[1])
                created_on = strip(row[2])
                description = strip(row[3])
                delivered_to = strip(row[4])
                delivered_by = strip(row[5])
                barcode = strip(row[6])

                query = """
                    merge (delivery:Delivery {name:{a}})
                    merge (email:Email {email:{b}})
                    merge (created_on:Created_On {created_on:{c}})
                    merge (description:Description {describe:{d}})
                    merge (email:Email {email:{e}})
                    merge (email:Email {email:{f}})
                    merge (barcode:Barcode {code:{g}})
                  ##and there are some relationships##
                   """
                   batch.append(query, {"a": delivery, "b": created_by, "c": created_on "d": description, "e": delivered_to,
                                     "f": delivered_by, "g": barcode})
                  .........................................................
                  .........code goes as described in the hypherlink........

“email”节点之前是从另一个“people.csv”文件创建的,并且“email”节点存在唯一性约束。在上述行中,我想通过关系将“created_by”、“delivered_to”和“delivered_by”节点与之前创建的“email”节点合并。当我运行代码时,它给出了错误email already declared,并且没有从 csv 创建任何节点。如何组织密码查询以防止此错误?谢谢。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您有 3 个节点尝试在查询中调用 email。您需要重命名其中两个,以免有任何重复。

    query = """
         merge (delivery:Delivery {name:{a}})
         merge (email:Email {email:{b}})
         merge (created_on:Created_On {created_on:{c}})
         merge (description:Description {describe:{d}})
         merge (email:Email {email:{e}})                # <- pick a different name
         merge (email:Email {email:{f}})                # <- pick a different name
         merge (barcode:Barcode {code:{g}})
    

    MATCHing 或MERGEing 时,如果您在: 之前提供一个名称(如上面示例中的email 和其他名称),您会将匹配或合并的节点绑定到该名称。您不能为多个节点提供相同的名称。

    如果您以后不打算在查询中使用这些名称,我建议不要命名它们。例如:

    merge (:Email {email:{b}})
    

    将合并您的Email 节点而不保留对它的引用。从您的代码中可以看出,我认为您可以排除这些名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多