知识图谱py2neo基本操作(2021-11-11)

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识图谱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)})

参考: Link Link

以上是关于知识图谱py2neo基本操作(2021-11-11)的主要内容,如果未能解决你的问题,请参考以下文章

知识图谱Python.py2neo操作Neo4j

KG构建《红楼梦》知识图谱

KG构建《红楼梦》知识图谱

KG构建《红楼梦》知识图谱

知识图谱Neo4j 删除清空数据库的方法

py2neo+Neo4j初体验