知识图谱py2neo基本操作(2021-11-11)
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识图谱py2neo基本操作(2021-11-11)相关的知识,希望对你有一定的参考价值。
py2neo基本操作(2021-11-11)
1. 连接Neo4j数据库
要通过python来操作Neo4j,首先需要安装py2neo,可以直接使用pip安装。
pip install py2neo
在完成安装之后,打开pycharm,调用py2neo即可.
from py2neo import Graph,Node,Relationship
test_graph = Graph (
"http://localhost:7474",
username="neo4j",
password="neo4j"
)
Neo4j的服务器装好了之后,默认的端口号就是7474,所以本地的主机就是"http://localhost:7474"
。默认的用户名密码都是neo4j,不过也可以在浏览器中进入 http://localhost:7474
,首次进入会提示你进行密码修改。
2. 节点的建立
节点的建立要用到py2neo.Node,建立节点的时候要定义它的节点类型(label)以及一个基本属性(property,包括property_key和property_value)。
以下代码为建立了两个测试节点:
# 注意:这里不要加“label=”,否则label会以属性的形式展示,而非标签
test_node_1 = Node("Person",name = "test_node_1")
test_node_2 = Node("Person",name = "test_node_2")
neo_graph.create(test_node_1)
neo_graph.create(test_node_2)
这两个节点的类型(label)都是Person,而且都具有属性(property_key)为name,属性值(property_value)分别为"test_node_1",“test_node_2”。
3. 节点间关系的建立
节点间的关系(Relationship)是有向的,所以在建立关系的时候,必须定义一个起始节点和一个结束节点。值得注意的是,起始节点可以和结束节点是同一个点,这时候的关系就是这个点指向它自己。
node_1_call_node_2 = Relationship(test_node_1,'CALL',test_node_2)
node_1_call_node_2['count'] = 1
node_2_call_node_1 = Relationship(test_node_2,'CALL',test_node_1)
node_2_call_node_1['count'] = 2
neo_graph.create(node_1_call_node_2)
neo_graph.create(node_2_call_node_1)
如以上代码,分别建立了test_node_1指向test_node_2和test_node_2指向test_node_1两条关系,关系的类型为"CALL",两条关系都有属性count,且值为1。
注意:如果建立关系的时候,起始节点或者结束节点不存在,则在建立关系的同时建立这个节点。
# 建立节点
test_node_1 = Node("人",name = "小明")
test_node_2 = Node("人",name = "小红")
test_graph.create(test_node_1)
test_graph.create(test_node_2)
# 建立关系
node_1_call_node_2 = Relationship(test_node_1,'喜欢',test_node_2)
# node_1_call_node_2['count'] = 1
node_2_call_node_1 = Relationship(test_node_2,'讨厌',test_node_1)
# node_2_call_node_1['count'] = 2
test_graph.create(node_1_call_node_2)
test_graph.create(node_2_call_node_1)
4. 删除节点
test_node_3 = Node("人",name = "小刚")
test_graph.create(test_node_3)
test_graph.delete(test_node_3)
# 全删
test_graph.delete_all()
5. 节点/关系的属性赋值以及属性值的更新
更新属性值就使用push函数来进行更新即可!
test_node_2['age'] = 20
test_graph.push(test_node_2)
test_node_2['age'] = 22
test_graph.push(test_node_2)
node_1_call_node_2['程度'] = '非常'
test_graph.push(node_1_call_node_2)
6. 通过属性值来查找节点和关系(find,find_one)
通过find和find_one函数,可以根据类型和属性、属性值来查找节点和关系。
示例如下:
find_code_1 = neo_graph.find_one(
label="Person",
property_key="name",
property_value="test_node_1"
)
print find_code_1['name']
find和find_one的区别在于:
find_one的返回结果是一个具体的节点/关系,可以直接查看它的属性和值。如果没有这个节点/关系,返回None。
find返回的结果是一个游标cursors,必须要通过循环取到所找到的所有节点/关系。
通过节点/关系查找相关联的节点/关系
如果已经确定了一个节点或者关系,想找到和它相关的关系和节点,就可以使用match和match_one。
find_relationship = neo_graph.match_one(start_node=find_code_1,end_node=find_code_3,bidirectional=False)
print find_relationship
如以上代码所示,match和match_one的参数包括start_node,Relationship,end_node中的至少一个。
bidirectional
: 是指关系是否可以双向。
如果为False,则起始节点必须为start_node,结束节点必须为end_node。如果有Relationship参数,则一定按照Relationship对应的方向。
如果为True,则不需要关心方向问题,会把两个方向的数据都返回。
match_relation = neo_graph.match(start_node=find_code_1,bidirectional=True)
for i in match_relation:
print i
i['count']+=1
neo_graph.push(i)
如以上代码所示,查找和find_code_1相关的关系。
match里面的参数只写了start_node,bidirectional的值为True,则不会考虑方向问题,返回的是以find_code_1为起始节点和结束节点的所有关联关系。
如果,bidirectional的值为False,则只会返回以find_code_1为起始节点的所有关联关系。
用CQL进行查询,返回的结果是list
data1 = test_graph.run('MATCH (a:人) RETURN a')
print(data1, type(data1))
# "[<Record a=(_214:人 {name: '\\u5c0f\\u660e'})>, <Record a=(_254:人 {age: 22, name: '\\u5c0f\\u7ea2'})>] <class 'list'>"
print(data1[0]['a']['name'])
# "小明"
可以利用 run 方法来执行Cypher语句,返回的是游标cursors,cursors必须通过遍历来展示结果
find_rela = neo_graph.run("match (n:Person{name:'test_node_1'}) return n")
for i in find_rela :
print i
查节点
print(pd.DataFrame(test_graph.nodes.match('人')))
# age name
# 0 NaN 小明
# 1 22.0 小红
print(pd.DataFrame(test_graph.nodes.match('人', name='小红')))
# age name
# 0 22.0 小红
查关系
print(list(test_graph.match(r_type="喜欢")))
# [(小明)-[:喜欢 {程度: '\\u975e\\u5e38'}]->(小红)]
print(list(test_graph.match(r_type="讨厌")))
# [(小红)-[:讨厌 {}]->(小明)]
7. 读取
neo4j是否能直接读取文件,如 csv ?
答案是可以的。Cypher语言可以;而py2neo模块只能通过执行Cypher语言读取,而没有python函数或方法读取。
官网例子如下:
LOAD CSV WITH HEADERS FROM 'https://neo4j.com/docs/cypher-manual/4.0/csv/artists-with-headers.csv' AS line
CREATE (:Artist { name: line.Name, year: toInteger(line.Year)})
以上是关于知识图谱py2neo基本操作(2021-11-11)的主要内容,如果未能解决你的问题,请参考以下文章