【问题标题】:Creating Unique Node Relationships with Py2Neo from CSV从 CSV 使用 Py2Neo 创建唯一的节点关系
【发布时间】:2022-01-24 16:18:53
【问题描述】:

我有一些 csv 格式的数据。每行描述两个节点之间的关系。节点可以与其他节点有多个关系,尽管每行只有一个关系。

例如,这是从 csv 中的一行派生的关系:

(Entity1:Name {Type,Details})-[关系类型]->(Entity2:Name {Type,Details})

Entity1 可以在不同的行中代替 Entity2,反之亦然。 Entity1 也可以与 Entity3 和 Entity4 等有关系,尽管它的类型永远不会改变。

使用 Py2Neo 我可以导入和创建关系,但最终会得到实体的大量重复节点。我希望每个实体节点都是唯一的。这就是我所拥有的:

def payload1(entity1,type1,relationtype,details_one,entity2,type2,details_two):
        graph = Graph("bolt://localhost:7687",auth=("Admin", "Password"))
        Entity1 = Node(type1,Name=entity1,Details=details_one)
        Entity2 = Node(type2,Name=entity2,Details=details_two)
        graph.create(Entity1)
        graph.create(Entity2)
        graph.create(Relationship(Entity1,relationtype,Entity2))




    df = pd.read_csv ('Data.csv')
    entities1 = df['Entity1'].tolist()
    types1 = df['Type'].tolist()
    relations1 = df['RelationType'].tolist()
    details1 = df['Details'].tolist()
    entity2 = df['Entity2'].tolist()
    types2 = df['Type2'].tolist()
    details_two = df['Details.1'].tolist()
    for (a, b, c,d,e,f,g) in itertools.zip_longest(entities1,types1,relations1,details1,entity2,types2,details_two):
        print (a, b, c,d,e,f,g)
        data = [((a,b,d),(c),(e,f,g))]
        keys = ["Name","Type","Details"]
        payload1(a,b,c,d,e,f,g)

【问题讨论】:

    标签: python csv neo4j py2neo


    【解决方案1】:

    与其进行创建,不如进行合并。简单来说,merge 如果存在就不会创建重复节点。这是有关它的文档:

    参考:https://py2neo.org/v4/_modules/py2neo/database.html#Transaction.merge

    对于每个节点,通过将该节点与 基于单个标签的潜在远程等效项和 适当的价值。如果没有找到远程匹配,则创建一个新节点; 如果找到匹配项,则远程节点的标签和属性 已更新。

    OLD code:
        graph.create(Entity1) 
    
    NEW code:
        graph.merge(Entity1) 
    

    【讨论】:

    • 这不起作用 - 它要求我提供 Entity1 的主键和标签。
    • 你的节点没有约束和索引,所以你应该先定义它们,以便neo4j可以判断节点是否存在。例如;创建一个约束: CREATE CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE;在 :Person(name) 上创建索引;
    • 节点名称为 type1 和 type2。由于我没有你的 csv 副本,我会让你弄清楚。
    • 合并中的所有属性都应该相同,以避免重复节点。有时这意味着协调属性或将属性移动到边缘或具有属性的范围/列表。例如,如果源数据中一个人的姓名是 John Doe 或 John C Doe,您将创建两个节点。甚至有重复的空格。
    猜你喜欢
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多