参考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,并输出已创建关系的数量。否则,函数将打印出任何发生的错误。
请注意,这段代码是根据您提供的代码进行修改的,因此我无法保证它是否会完全解决您的问题。但是,我希望它能给您提供一些帮助。