利用python创建知识图谱,但是运行结果没有显示relationship,代码没有报错,检查了逻辑关系应该也没有问题
下面时neo4j界面
下面是代码部分
'''创建实体关系边'''
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
恳请各位前辈指导解惑
参考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,并输出已创建关系的数量。否则,函数将打印出任何发生的错误。
请注意,这段代码是根据您提供的代码进行修改的,因此我无法保证它是否会完全解决您的问题。但是,我希望它能给您提供一些帮助。
这段代码是一个Python中的函数,主要用于创建实体关系边和实体关联边。函数的具体实现过程如下:
调用 self.read_nodes() 函数,读取作者和文章的节点信息,以及作者与文章之间的关系信息。
调用 self.create_relationship() 函数,创建作者和文章之间的关联边,关系类型为 "first_author",关系名称为 "第一作者"。
在 self.create_relationship() 函数中,首先对关系信息进行去重处理,避免重复创建关系。然后遍历关系信息,对每一个关系创建一条关联边。
创建关联边的过程中,首先根据起始节点和结束节点的名称,构造一个Cypher查询语句。查询语句中使用了MATCH子句,通过节点名称来匹配起始节点和结束节点。然后使用CREATE子句,创建起始节点和结束节点之间的关联边。
在创建关联边的过程中,如果出现了异常,会将异常信息打印出来。如果成功创建了一条关联边,会将当前已经创建的关联边数量和总共需要创建的关联边数量打印出来。
需要注意的是,这段代码是在使用Python的neo4j库,通过Cypher语句来操作Neo4j数据库。如果要运行这段代码,需要先安装neo4j库和相关依赖,并连接到对应的Neo4j数据库。同时,需要提供作者和文章节点信息,以及作者与文章之间的关系信息。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
Neo4j界面上没有显示关系,很可能是由于以下原因导致:
1.关系名称(Rel_name)可能为空值([unknow])或者拼写错误,导致显示不出来。
2.可能是代码的创建关系语句有错误,需要检查语句的正确性。
下面是对代码的一些建议:
1.在创建关系时,可以在查询语句中加入关键字“return”,将查询结果返回,以便于查看和调试。
2.建议使用Neo4j自带的py2neo库来管理和操作Neo4j数据库,避免在查询语句中出现语法错误。
3.检查节点和关系的数据类型是否匹配,例如有时候从csv文件中读取的数据为字符串类型,需要转成整型或浮点型才能正确使用。
下面是一些示例相关的代码:
#使用py2neo库连接Neo4j
from py2neo import Graph, Node, Relationship
class BuildGraph():
def __init__(self):
self.g = Graph(host='localhost', port=7687, password='123456')
#创建节点
def create_node(self, label, nodes):
for i in range(len(nodes)):
node = Node(label, name=nodes[i]['name'], id=nodes[i]['id'])
self.g.create(node)
#创建关系,有返回值
def create_relationship(self, start_label, end_label, edges, rel_type, rel_name):
rels = []
for edge in edges:
node_start = self.g.nodes.match(start_label, id=edge['start']).first()
node_end = self.g.nodes.match(end_label, id=edge['end']).first()
rel = Relationship(node_start, rel_type, node_end, name=rel_name)
rels.append(rel)
return rels
if __name__ == '__main__':
datas = {#节点和边的数据}
bg = BuildGraph()
bg.create_node('author', datas['author'])
bg.create_node('article', datas['article'])
rels = bg.create_relationship('author', 'article', datas['rels'], 'first_author', '第一作者')
for rel in rels:
print(rel)
希望可以帮到你。
如果我的回答解决了您的问题,请采纳!
看了下文章:https://zhuanlan.zhihu.com/p/88745411
文中创建关系使用的关键字是 MERGE ,而不是create,不知道是不是这个原因。
建立关系从这篇文章 https://blog.csdn.net/L_goodboy/article/details/123987752 看来应该有更简便的方法,就是使用Relationship函数,可以参考下。