Heavymantory 2023-03-06 11:21 采纳率: 71.4%
浏览 162
已结题

利用python构建知识图谱,在neo4j里显示不了关系,如何解决?

利用python构建知识图谱,在neo4j里显示不了关系,但是代码运行没有问题,下面是代码部分

    '''读取文件'''

    def read_nodes(self):
        author = []
        article = []

        passage_infos = []

        # 构建节点实体关系
        rels_writer = []

        count = 0
        for data in open(self.data_path, encoding='utf-8'):
            passage_dict = {}
            count += 1
            print(count)
            data_json = json.loads(data)
            passage = data_json['article']
            passage_dict['article'] = passage
            article.append(passage)

            if 'author' in data_json:
                author.append(data_json['author'])
                rels_writer.append([passage, data_json['author']])

            passage_infos.append(passage_dict)
            print(author)
        return set(author), rels_writer, passage_infos, set(article)

    '''建立节点'''

    def create_node(self, label, nodes):
        count = 0
        for node_name in nodes:
            node = Node(label, name=node_name)
            self.g.create(node)
            count += 1
            print(count, len(nodes))
        return

    '''创建知识图谱中心文章的节点'''

    def create_passage_nodes(self, passage_infos):
        count = 0
        for passage_dict in passage_infos:
            node = Node("Article", name=passage_dict['article'])
            self.g.create(node)
            count += 1
            print(count)
        return

    '''创建知识图谱实体节点类型schema'''

    def create_graphnodes(self):
        Author, rels_writer, passage_infos, Article = self.read_nodes()
        self.create_passage_nodes(passage_infos)
        self.create_node('Author', Author)
        print(len(Author))
        return

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

    def create_graphrels(self):
        Author, rels_writer, passage_infos, Article, = self.read_nodes()
        print(rels_writer)
        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(edge))
            all = len(set(set_edges))
        for edge in set(set_edges):
            edge = edge.split('###')
            p = edge[0]
            q = edge[1]
            query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{name:'%s'}]->(q)" % (
                start_node, end_node, p, q, rel_type, rel_name)
            try:
                self.g.run(query)
                count += 1
                print(rel_type, count, all)
            except Exception as e:
                print(e)
        return

    '''导出数据'''

    def export_data(self):
        author, rels_writer, passage_infos, article = self.read_nodes()
        f_author = open('author.txt', 'w+')
        f_article = open('article.txt', 'w+')

        f_author.write('\n'.join(list(author)))
        f_article.write('\n'.join(list(article)))

        f_author.close()
        f_article.close()

        return


if __name__ == '__main__':
    handler = ProcessGraph()
    handler.create_graphnodes()  # 建立节点
    handler.create_graphrels()  # 建立实体关系边
    # handler.export_data()
恳请各位前辈指导

  • 写回答

5条回答 默认 最新

  • 「已注销」 2023-03-06 11:38
    关注

    参考GPT和自己的思路,如果代码没有报错,但是在Neo4j中显示不了关系,可能有以下几个原因:

    1 关系类型名称不正确:在代码中创建关系时,需要给关系类型命名,如果命名不正确,Neo4j将无法识别该关系类型,因此需要检查代码中关系类型名称的正确性。

    2 数据库连接错误:在连接Neo4j数据库时,可能存在连接失败的情况,可以检查连接参数、用户名、密码等是否正确,也可以尝试重新启动Neo4j数据库。

    3 数据库权限不足:在Neo4j中,可能存在某些节点或关系受到保护,只有具有足够权限的用户才能够查看或修改它们。如果当前用户没有足够的权限,可能会看不到关系,可以尝试使用具有足够权限的用户登录Neo4j。

    4 关系建立失败:在代码中创建关系时,可能会出现建立失败的情况,例如节点名称不正确、节点不存在等。在建立关系时,需要确保节点名称正确、节点存在,并且没有重复建立同一个关系。

    在你的代码中,创建实体关系边时调用了 create_relationship 方法,但是在该方法中调用了 self.create_relationship 方法,这可能是一个笔误,导致程序抛出 NameError 异常。同时,如果在创建关系边时没有显示错误,但是在 Neo4j 中没有显示关系,可能是因为你的代码没有提交事务,你可以在 create_relationship 方法中添加 self.g.commit() 来提交事务。下面是修改后的代码示例:

    from py2neo import Graph, Node
    
    class ProcessGraph(object):
        def __init__(self):
            self.data_path = 'data.txt'
            self.g = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
    
        def read_nodes(self):
            author = []
            article = []
            passage_infos = []
            rels_writer = []
            count = 0
            for data in open(self.data_path, encoding='utf-8'):
                passage_dict = {}
                count += 1
                print(count)
                data_json = json.loads(data)
                passage = data_json['article']
                passage_dict['article'] = passage
                article.append(passage)
                if 'author' in data_json:
                    author.append(data_json['author'])
                    rels_writer.append([passage, data_json['author']])
                passage_infos.append(passage_dict)
                print(author)
            return set(author), rels_writer, passage_infos, set(article)
    
        def create_node(self, label, nodes):
            count = 0
            for node_name in nodes:
                node = Node(label, name=node_name)
                self.g.create(node)
                count += 1
                print(count, len(nodes))
            return
    
        def create_passage_nodes(self, passage_infos):
            count = 0
            for passage_dict in passage_infos:
                node = Node("Article", name=passage_dict['article'])
                self.g.create(node)
                count += 1
                print(count)
            return
    
        def create_graphnodes(self):
            Author, rels_writer, passage_infos, Article = self.read_nodes()
            self.create_passage_nodes(passage_infos)
            self.create_node('Author', Author)
            print(len(Author))
            return
    
        def create_graphrels(self):
            Author, rels_writer, passage_infos, Article, = self.read_nodes()
            print(rels_writer)
            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(edge))
                all = len(set(set_edges))
            for edge in set(set_edges):
                edge = edge.split('###')
                p = edge[0]
                q = edge[1]
                query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{name:'%s'}]->(q)" % (
                    start_node, end_node, p, q, rel_type, rel_name)
                try:
                    self.g.run(query)
                    count += 1
                    print(rel_type, count, all)
                except Exception as e:
                    print(e)
            return
    
        '''导出数据'''
    
        def export_data(self):
            author, rels_writer, passage_infos, article = self.read_nodes()
            f_author = open('author.txt', 'w+')
            f_article = open('article.txt', 'w+')
    
            f_author.write('\n'.join(list(author)))
            f_article.write('\n'.join(list(article)))
    
            f_author.close()
            f_article.close()
    
            return
    
    
    if __name__ == '__main__':
        handler = ProcessGraph()
        handler.create_graphnodes()  # 建立节点
        handler.create_graphrels()  # 建立实体关系边
        # handler.export_data()
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 电脑开机过商标后就直接这样,求解各位
  • ¥15 mysql , 用自己创建的本地主机和用户名 登录不上
  • ¥15 关于#web项目#的问题,请各位专家解答!
  • ¥15 vmtools环境不正常
  • ¥15 请问如何在Ubuntu系统中安装使用microsoft R open?
  • ¥15 jupyter notebook
  • ¥30 informer时间序列预测
  • ¥20 SSR引物多态性分析
  • ¥15 大漠插件在Win11易语言注册调用和免注册灵异事件,VS上注册调用完全没问题
  • ¥15 Addressable缓存机制做热更新的问题