Heavymantory 2023-03-04 14:39 采纳率: 71.4%
浏览 82
已结题

利用python创建知识图谱,但是运行结果没有显示relationship,检查了逻辑关系应该也没有问题下面时neo4j界面,如何解决?

利用python创建知识图谱,但是运行结果没有显示relationship,代码没有报错,检查了逻辑关系应该也没有问题
下面时neo4j界面

img

下面是代码部分

 '''创建实体关系边'''

    def create_graphrels(self):
        author, article, rels_writer = self.read_nodes()
        self.create_relationship('author', 'article', rels_writer, 'first_author', '第一作者')

    '''创建实体关联边'''

    def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):
        count = 0
        # 去重处理
        set_edges = []
        for edge in edges:
            set_edges.append('###'.join(map(str,edge)))
        all = len(set(set_edges))
        for edge in set(set_edges):
            edge = edge.split('###')
            p = edge[0]
            q = edge[1]
            query = f'match(p:{start_node}),(q:{end_node}) where p.name=["{p}"] and q.name="{q}" create (p)-[rel:{rel_type}{{name:"{rel_name}"}}]->(q)'
            try:
                self.g.run(query)
                count += 1
                print(rel_type, count, all)
            except Exception as e:
                print(e)
        return
恳请各位前辈指导解惑

  • 写回答

4条回答 默认 最新

  • 「已注销」 2023-03-04 16:31
    关注

    参考GPT和自己的思路,根据您提供的代码,我发现您在创建实体关系边时,使用了rels_writer,但是在代码中并没有给出rels_writer的定义和初始化,所以我无法判断rels_writer是否存在问题,可能是导致关系没有显示的原因之一。此外,还有一些其他问题可能也会影响到您的知识图谱的生成。

    以下是我建议您优化的几点:

    1 修改 create_relationship() 函数中的match()语句。
    在创建实体关联边时,使用了where语句来匹配起始节点和结束节点。其中,对于起始节点,您使用了p.name=["{p}"]来匹配节点名称,但是这样写是不正确的,应该使用p.name="{p}"。对于结束节点,您可以直接使用q.name="{q}"来匹配节点名称。因此,修改后的match()语句应该是这样的:

    query = f'match(p:{start_node}),(q:{end_node}) where p.name="{p}" and q.name="{q}" create (p)-[rel:{rel_type}{{name:"{rel_name}"}}]->(q)'
    

    2 修改 set_edges 变量中的join()方法。
    join()方法用于将字符串列表连接成一个字符串。在您的代码中,您使用了join()方法来连接边的起始节点和结束节点,但是这样写可能存在问题,因为节点名称中可能存在特殊字符,导致连接后的字符串不符合预期。因此,我建议您使用其他方式来将起始节点和结束节点连接成一个字符串。例如,可以使用f"{p}###{q}"这样的字符串格式。修改后的代码如下所示:

    set_edges = []
    for edge in edges:
        set_edges.append(f"{edge[0]}###{edge[1]}")
    

    3 检查实体节点是否正确创建。
    在您的代码中,实体节点的创建是在read_nodes()函数中完成的。因此,在调用create_graphrels()函数之前,您需要确保实体节点已经正确创建。您可以在read_nodes()函数中添加一些输出语句,以便检查实体节点是否正确创建。例如,您可以添加以下语句:

    print(author[:10])
    print(article[:10])
    

    通过输出实体节点的前几个元素,您可以快速检查节点是否正确创建。

    综上所述,您可以尝试使用以下代码来创建实体关系边和实体关联边:

    def create_graphrels(self):
        author, article, rels_writer = self.read_nodes()
        self.create_relationship('author', 'article', rels_writer, 'first_author', '第一作者')
    
    def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):
        count = 0
        # 去重处理
        set_edges = []
        for edge in edges:
            set_edges.append(f"{edge[0]}###{edge[1]}")
    all = len(set(set_edges))
    for edge in set(set_edges):
        edge = edge.split('###')
        p = edge[0]
        q = edge[1]
        query = f'match(p:{start_node}),(q:{end_node}) where p.name=["{p}"] and q.name="{q}" create (p)-[rel:{rel_type}{{name:"{rel_name}"}}]->(q)'
        try:
            self.g.run(query)
            count += 1
            print(rel_type, count, all)
        except Exception as e:
            print(e)
    return
    
    

    此代码块中的 create_graphrels() 函数首先调用 read_nodes() 函数来获取实体节点和实体关系边。然后,它调用 create_relationship() 函数来创建关系。

    create_relationship() 函数首先遍历传递给它的边,并在一个列表中去重处理。然后,它使用一个 for 循环迭代边列表中的所有边。对于每个边,函数将边拆分为起始节点和终止节点,将它们插入 Cypher 查询字符串中,并使用 run() 方法将查询提交到 Neo4j 数据库。

    如果查询成功,计数器变量 count 值加 1,并输出已创建关系的数量。否则,函数将打印出任何发生的错误。

    请注意,这段代码是根据您提供的代码进行修改的,因此我无法保证它是否会完全解决您的问题。但是,我希望它能给您提供一些帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月6日
  • 已采纳回答 3月5日
  • 赞助了问题酬金15元 3月4日
  • 创建了问题 3月4日

悬赏问题

  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题