使用py2neo对Neo4j进行操作

使用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'))
    
    # 其余的可用以上三种结合查询所有关系的格式组合得到
    
    # 获得的relation可以通过遍历relation数组获得start_node和end_node以及其属性
    relation[0].start_node['id']
    
  • 查询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()
    
posted @ 2023-01-24 13:55  ryukirin  阅读(351)  评论(0编辑  收藏  举报