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

利用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 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题