py2neo-neo4j同名节点合并以及neo4j配置等问题
最近赶毕业论文,需要用neo4j构建知识图谱,遇到一些问题这里记录一下。
1.neo4j配置问题
像环境变量配置攻略有很多也较为简单,这里说一下配置好环境变量后可能出现的问题:
(1).Invoke-Neo4j : Could not find java at…
解决方法:找到neo4j安装目录bin\mannagent 下的get-Java.ps文件夹,这里是我的该文件路径D:\ECNU\neo4j-community-3.5.5\bin\Neo4j-Management\Get-Java.ps1,修改其中**$javaPath**,如下:
原: process
{
$javaPath = ‘’
$javaCMD = ‘’
修改为:
process
{
$javaPath = ‘C:\Program Files\Java\jdk-15.0.2’
$javaCMD = ‘’
(把jdk路径添加进去即可。)
(2) 跳过账号验证等
打开neo4j.conf配置文件,我的:D:\ECNU\neo4j-community-3.5.5\conf\neo4j.conf,将
dbms.security.auth_enabled=true取消注释并将true改为false。***
dbms.connectors.default_listen_address=0.0.0.0 也要取消注释。
2.neo4j同名节点合并问题
注意:此方法面向neo4j3.5.4版本及之后。
此方法采用的是Nodematcher方法,原理很简单,看一遍代码就明白了,这里简单说一下:
首先可以先创建若干个节点,然后对每个节点进行遍历,遍历之前会采用该方法先判断当前节点是否与已存在节点重复,如果重复则跳过创建节点步骤,直接创建关系。重点注意的是当节点存在时,创建关系需要用Nodelist[0]来代替该节点。,具体请参考一下代码。
test.csv内容如图:
from py2neo import Graph, Node, Relationship,NodeMatcher
import csv
# 连接neo4j数据库,输入地址、用户名、密码
graph = Graph("http://localhost:7474")
graph.delete_all()
node = Node('人物1',name= '毛泽东')
node2 = Node('人物2',name= '蔡和森')
graph.create(node)
graph.create(node2)
with open('test.csv', 'r') as f:
reader = csv.reader(f)
data = list(reader)
#遍历节点
for i in range(1,len(data)):
matcher = NodeMatcher(graph)
#nodelist[0]就代表当前遍历节点
nodelist = list(matcher.match('人物1', name=data[i][0]))
if len(nodelist) > 0:
matcher = NodeMatcher(graph)
nodelist1 = list(matcher.match('人物2', name=data[i][1]))
if len(nodelist1)>0:
print("两个都有")
#尤为重要,采用nodelist[0]会跳过创建节点而直接建立联系,
# 如果先node = ('人物1', name=data[i][0]),再Relationship(node, data[i][2], node2)还是会重复建立节点
zhucong = Relationship(nodelist[0], data[i][2], nodelist1[0])
graph.create(zhucong)
else:
cong = Node('人物2', name=data[i][1])
graph.create(cong)
zhucong = Relationship(nodelist[0], data[i][2], cong)
graph.create(zhucong)
else:
zhu = Node('人物1', name=data[i][0])
graph.create(zhu)
matcher = NodeMatcher(graph)
nodelist1 = list(matcher.match('人物2', name=data[i][1]))
if len(nodelist1)>0:
print('1没有2有')
zhucong = Relationship(zhu, data[i][2], nodelist1[0])
graph.create(zhucong)
else:
cong = Node('人物2', name=data[i][1])
graph.create(cong)
zhucong = Relationship(zhu, data[i][2], cong)
graph.create(zhucong)
3.neo4j节点更换标签问题
示例:
如有疑问,欢迎留言。