利用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()
恳请各位前辈指导
参考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()
该回答引用ChatGPT
根据提供的代码,可能有几种原因导致无法在 Neo4j 中显示关系。下面是一些可能的解决方法:
1、确保 Neo4j 服务器已经启动,并且您已经在代码中正确配置了服务器连接信息。可以使用以下代码检查 Neo4j 服务器的状态:
from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
session = driver.session()
result = session.run("MATCH (n) RETURN count(n)")
count = result.single()[0]
print("Number of nodes in the graph: ", count)
session.close()
driver.close()
如果您无法连接到 Neo4j 服务器,请检查连接信息和服务器设置。
2、检查节点和关系的标签和属性是否正确。确保节点和关系的标签和属性与您在 Cypher 查询中使用的标签和属性匹配。
3、检查实体关系边创建时的关系类型和关系名称是否正确。如果关系类型或名称不正确,您将无法在 Neo4j 中正确地显示关系。您可以使用以下代码检查关系是否正确地创建:
from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
session = driver.session()
result = session.run("MATCH ()-[r]->() RETURN count(r)")
count = result.single()[0]
print("Number of relationships in the graph: ", count)
session.close()
driver.close()
如果关系数量不正确,请检查实体关系边创建时的关系类型和名称是否正确。
4、检查实体关系边的方向是否正确。在实体关系边创建时,您需要指定关系的方向。如果方向不正确,您将无法在 Neo4j 中正确显示关系。您可以使用以下代码检查关系是否具有正确的方向:
from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
session = driver.session()
result = session.run("MATCH ()-[r]->() RETURN type(r), count(r)")
for record in result:
print(record["type(r)"], record["count(r)"])
session.close()
driver.close()
如果关系方向不正确,请检查实体关系边创建时的起始节点和结束节点的顺序是否正确。
参考GPT的回答和自己的思路,根据提供的代码,可能有以下原因导致关系无法显示在Neo4j中:
连接Neo4j数据库的部分代码没有提供,可能存在问题;
在建立实体关系边的函数create_graphrels()中,读取数据时多了一个逗号Article,,可能会导致程序出错;
在函数create_relationship()中,关系类型rel_type和关系名称rel_name的参数顺序和名称与实际使用不一致,需要修改参数顺序和名称;
数据中存在重复关系,可能会导致程序运行缓慢或出错,可以在函数create_relationship()中进行去重处理。
以下是修改后的代码:
from neo4j import GraphDatabase, basic_auth
import json
class ProcessGraph:
def __init__(self):
self.data_path = "data.json"
self.uri = "bolt://localhost:7687"
self.driver = GraphDatabase.driver(self.uri, auth=basic_auth("neo4j", "password"))
self.g = self.driver.session()
def __del__(self):
self.driver.close()
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_name, rel_type):
count = 0
set_edges = []
for edge in edges:
set_edges.append('###'.join(edge))
set_edges = set(set_edges)
all = len(set_edges)
for edge in 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+', encoding='utf-8')
f_article = open('article.txt', 'w+', encoding='utf-8')
f_author.write('\n'.join(list(author)))
f_article.write('\n'.join(list(article)))
f_author.close()
f_article.close()
return
请注意,我在代码中增加了文件的编码方式参数 encoding='utf-8',以确保在写入文件时不会出现编码问题。
“Devil组”引证GPT后的撰写:
检查三点: