使用py2neo对Neo4j进行操作
安装
Java 17
下载
没安装Java的需要先安装Java,具体版本参照官方手册
https://neo4j.com/docs/operations-manual/current/installation/windows/
下载地址
https://www.oracle.com/java/technologies/downloads/#java17
安装
下载完成点击执行文件按步骤安装
安装之后配置环境变量。
Windows下:
-
用户变量中:新建JAVA_HOME变量,值为安装目录
例:D:\Java\jdk-17
-
环境变量中:Path中添加%JAVA_HOME%\bin
测试
win+R打开cmd,输入java -version,显示java版本为17就行
Neo4j
neo4j社区版
https://neo4j.com/download-center/#community
按照下载后的提示走
之后win+R打开cmd,执行安装目录\bin\neo4j console
例如:D:\neo4j\bin\neo4j console
访问http://localhost:7474/即可看到操作页面
python操作
驱动
neo4j-driver
原名neo4j-driver,现在改成了neo4j
pip install neo4j
py2neo
这里主要使用
pip install py2neo
基础示例
from py2neo import Node, Relationship, Graph
USERNAME = username
PASSWORD = password
# 新建图形
graph = Graph('http://localhost:7474', auth=(USERNAME, PASSWORD), name='neo4j')
# 新建node
# Node(labels, *properties)
a = Node('label', name='a')
b = Node('label', name='b')
# 在graph中绘制node
graph.create(a)
graph.create(b)
# 新建关系并绘制
# 可以增加一些属性,也可以省略
# Relationship(start_node, type, end_node, **properties)
r1 = Relationship(a, 'to', b, name='to')
graph.create(r1)
数据库操作(主要是节点和关系)
在所有操作前要有
USERNAME = your username
PASSWORD = your password
NAME = your database name
graph = Graph('http://localhost:7474', auth=(USERNAME, PASSWORD), name=NAME)
增
-
添加节点
node = Node("Person", name="Alice", id=node_1) graph.create(node)
第一个参数为节点的label,第二个为节点的名字,会显示在Neo4图中,第三个是节点的id,是我自定义的主键,方便查找。
都不是必须的,后两个是节点的特性(Properties)
-
添加label
node.add_label("Women")
-
添加特性(Properties)
node["age"] = 25
将new_name特性的值设置为value
-
添加关系
node_1 = Node("Person", name="Alice", id="node_1") node_2 = Node("Person", name="Bob", id="node_2") # 1.第一种方法 relationship = Relationship(node_1, "KNOWS", node_2) graph.create(relationship) # 2.第二种方法 class Knows(Relationship): pass ab = Knows(node_1, node_2) graph.create(ab) # 3.第三种方法 KNOWS = Relationship.type("KNOWS") ab = KNOWS(node_1, node_2) graph.create(ab)
-
添加子图
node_1 = node_matcher.match("Person").where(id='node_1').first() node_2 = node_matcher.match("Person").where(id='node_2').first() node_3 = node_matcher.match("Person").where(id='node_3').first() node_4 = node_matcher.match("Person").where(id='node_4').first() KNOWS = Relationship.type("KNOWS") ab = KNOWS(node_1, node_2) ac = KNOWS(node_1, node_3) s = ab | ac graph.create(s)
查
在查询之前
from py2neo import NodeMatcher, RelationshipMatcher
node_matcher = NodeMatcher(graph)
relation_matcher = RelationshipMatcher(graph)
-
查询节点
node = node_matcher.match("Person").where(name="Alice").first()
match()的参数是label,不必须,where()的参数是Properties,不必须
match的结果是一个list,所以需要添加.first()
-
查询关系
查询图中所有关系
relation = list(relation_matcher.match((node, None), r_type='idea'))
若要想通过节点或者关系名称查询前提是该节点已经查找出来,或者知道关系是什么
# 只知道起始节点 relation = list(relation_matcher.match((start_node, None))) # 只知道结束节点 relation = list(relation_matcher.match((None, end_node))) # 只知道关系type relation = list(relation_matcher.match(r_type='Knows')) # 其余的可用以上三种组合得到
-
查询label
# 查询node是否含有label node.has_label(label) # 查询node的label node.labels
-
查询特性(Properties)
# 查询名为name的特性值 # 1.第一种方法 node["name"] # 2.第二种方法 node_1.get("name") # 返回特性的个数 len(node) # 返回特性的字典 dict(node) # 将节点的特性和值以列表二元组形式返回 node.items() # 将节点的特性名字返回 node.key() # 将节点的特性值返回 node.values()
改
改的前提是已经查找出来
-
修改节点
# 修改节点的特性 node['name'] = 'May' # setdefault():如果有该特性,则返回其值,若没有则设置为'May' node.setdefault('name', default = 'May') # 修改到这里只是对本地数据进行了修改 # 若想在Neo4j中生效一定要添加这句 graph.push(node)
-
修改关系
# 修改节点的特性 relation['name'] = 'has' # setdefault():如果有该特性,则返回其值,若没有则设置为'May' relation.setdefault('name', default = 'has') # 修改到这里只是对本地数据进行了修改 # 若想在Neo4j中生效一定要添加这句 graph.push(relation)
删
删除节点需要先删除该节点上的关系
-
删除关系
graph.separate(relationship)
-
删除节点
graph.delete(node)
-
清空数据库
graph.delete_all()
-
删除label
# 删除一个label,如果存在的话 node.remove_label('Person') #删除所有label node.clear_label()
-
删除特性
# 删除一个特性,如果不存在就会有KeyError del node["name"] # 删除所有特性 node.clear()