我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python使用Py2neo创建Neo4j的节点和关系

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python使用Py2neo创建Neo4j的节点和关系

Neo4j是一款开源图数据库,使用Python语言访问Neo4j可以使用Py2neo。本文介绍了使用Py2neo访问Neo4j,批量创建节点和关系的方法。Py2neo提供了直接执行Cypher语句的方法,也提供了诸如Node、Relationship、Path一系列的数据结构,在不同的场景下可以灵活使用。

​本文使用的Py2neo是2021.1之后的版本,手册请戳这里:
The Py2neo Handbook

一、安装Py2neo

使用pip安装Py2neo,执行:


pip install py2neo

查看已安装的Py2neo是什么版本的:


pip show py2neo

二、连接Neo4j数据库

本文中会用到多种数据类型,在此一并引用

import numpy as np
import pandas as pd
from py2neo import Node,Relationship,Graph,Path,Subgraph

配置Neo4j数据库的访问地址、用户名和密码


neo4j_url = '访问地址'
user = '用户名'
pwd = '密码'

在此时间段之前访问数据库的方式为:


graph = Graph(neo4j_url, username=user, password=pwd)

在此时间段之后的版本访问数据库的方式为(就是这么不兼容):


graph = Graph(neo4j_url,  auth=(user, pwd))

1. 使用graph.run执行Cypher语句创建节点

如果熟悉Cypher语句的话,可以通过使用graph.run执行Cypher语句来实现创建节点等操作,方法如下所示:


cypher_ = "CREATE (:Person {name:'王王', age:35, work:'编程网}),\
(:Person {name:'李李', age:20, work:'编程网})"
graph.run(cypher_)

这样就在Neo4j中创建了两个label为Person的节点,第一个节点的name属性为“王王”,age属性为35,work属性为“编程网”,第二个节点的name属性为“李李”,age属性为20,work属性为“宇编程网”。

同样,可以通过调用graph.run执行Cypher语句创建关系。


cypher_ = "MATCH (from:Person{name:'王王'}),\
(to:Person{name:'李李'}) MERGE (from)-[r:同事]->(to)"
graph.run(cypher_)

这样在Neo4j中就有了具有同事关系的两个Person节点。

2. 使用Node数据结构创建节点

Py2neo也提供graph.create方法来创建节点和关系


node = Node("Person", name="李李", age=20, work="编程网")
graph.create(node)

与执行Cypher语句的效果相同,在Neo4j中创建了一个Person节点。

需要注意的是,这两种创建方法,如果反复执行的话,是会在Neo4j中创建出重复的节点的,即name、age、work属性完全一样,但在Neo4j中的id不一样的多个节点。

3. 使用Node、Relationship和Subgraph数据结构创建节点和关系

上面两种方法都是一次创建一个节点或者一个关系,Py2neo也提供了批量创建节点和关系的方法,而且性能更优。下面就以下图中的图谱为例,使用Py2neo提供Node、Relationship和Subgraph数据结构在Neo4j中创建节点和关系。

首先创建一些label为Person的节点,即Node对象,第一个参数是label,属性按key=value依次作为参数传入。如果节点有多个label,可以用Node.add_label("label_text")来追加label。


node1 = Node("Person", name="王王", age=35, work="编程网")
node2 = Node("Person", name="李李", age=20, work="编程网")
node3 = Node("Person", name="张张", age=30, work="编程网")
node4 = Node("Person", name="赵赵", age=45, work="月亮中学")
node4.add_label("Teacher")
node5 = Node("Person", name="刘刘", age=20, work="地球电子商务公司")

再创建一些label为Location的节点


node6 = Node("Location", name="南京") 
node7 = Node("Location", name="江宁区") 
node8 = Node("Location", name="禄口机场") 

建立一些Person和Person节点之间的关系,Neo4j中的关系是有方向的,所以Relationship第一个参数为起始节点,第三个参数是结束节点,而第二个节点为关系的类型。这里创建的同事、邻居的关系为双向的,老师、学生的关系为单向。


relation1 = Relationship(node1, "同事", node2)
relation2 = Relationship(node2, "同事", node1)

relation3 = Relationship(node2, "同事", node3)
relation4 = Relationship(node3, "同事", node2)

relation5 = Relationship(node3, "邻居", node4)
relation6 = Relationship(node4, "邻居", node3)

relation7 = Relationship(node4, "学生", node5)
relation8 = Relationship(node5, "老师", node4)

创建一些Location和Location节点之间的关系,地域之间的包含关系为单向。


relation9 = Relationship(node6, "包含", node7)
relation10 = Relationship(node7, "包含", node8)

创建Person节点和Location节点之间的关系,这里“到访”的关系是有属性的,date表示到访的日期,stay_hours表示停留的时间。可以使用一个key:value的字典数据结构保存属性,再赋予关系


properties1={'date':'2021-7-16','stay_hours':1}
relation11 = Relationship(node2, "到访", node8, **properties1)

properties2={'date':'2021-7-19','stay_hours':4}
relation12 = Relationship(node5, "到访", node8, **properties2)

然后将以上所有节点和关系组成Subgraph


node_ls = [node1, node2, node3, node4, 
           node5, node6, node7, node8]
relation_ls = [relation1, relation2, relation3, relation4, 
               relation5, relation6, relation7, relation8, 
               relation9, relation10, relation11, relation12]
subgraph = Subgraph(node_ls, relation_ls)

最后通过事务类Transaction提交,批量创建这些节点和关系。这里tx.create并没有真正创建节点和关系,直到graph.commit才一次性提交到Neo4j进行创建。


tx = graph.begin() 
tx.create(subgraph)
graph.commit(tx)

重复执行上面的命令,不会创造出重复的节点和关系。这一点手册中有说明:“subgraph中的已经和数据库绑定的实体将保持不变,那些没有绑定的将在数据库中新建并绑定上。”

create(subgraph) Create remote nodes and relationships that correspond to those in a local subgraph. Any entities in subgraph that are already bound to remote entities will remain unchanged, those which are not will become bound to their newly-created counterparts.

三、性能对比

做一个简单的实验粗略地对比逐个创建和批量创建的时间开销。在Neo4j为空数据库的情况下,分别采用逐个创建和批量创建的方法创建10000个节点,每个节点有name和age两个属性,都是随机生成的,使用jupyter notebook的%%time命令计算时间开销。


import random
N = 10000

逐个创建节点:


%%time
for i in range(N):
    random_name = "P"+str(round(random.random()*N*2))
    random_age = round(random.random()*15)
    node = Node("Person", name=random_name, age=random_age)
    graph.create(node)

CPU times: user 50.3 s, sys: 4.19 s, total: 54.5 s
Wall time: 5min 16s

批量创建节点:


%%time
node_ls = []
for i in range(N):
    random_name = "P"+str(round(random.random()*N*2))
    random_age = round(random.random()*15)
    node = Node("Person", name=random_name, age=random_age)
    node_ls.append(node)

subgraph = Subgraph(node_ls, [])
tx = graph.begin() 
tx.create(subgraph)
graph.commit(tx)

CPU times: user 448 ms, sys: 75.5 ms, total: 523 ms
Wall time: 1.46 s

实验中也发现,只是创建节点的话,批量创建方法的时间开销几乎是线性增长的,当一次性提交10万个节点的创建任务时,时间开销大约在4.5秒。
在使用Py2neo构建图谱时,尽可能使用批量创建方法。先创建节点(Node)对象、关系(Relationship)对象,再构成子图(Subgraph),最后利用事务类一次提交创建。
下一篇将介绍如何运用Py2neo查询节点、关系和路径。

这篇关于用Py2neo创建Neo4j的节点、关系及路径的文章就先介绍到这了,更多相关Py2neo内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python使用Py2neo创建Neo4j的节点和关系

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python使用py2neo查询Neo4j的节点、关系及路径

Neo4j是一款开源图数据库,Py2neo提供了使用Python语言访问Neo4j的接口。本文介绍了使用Py2neo的NodeMatcher和RelationshipMatcher查询图中的节点和关系,以及通过执行Cypher语句的查询方式
2022-06-02

C语言关于二叉树中堆的创建和使用整理

大家好,这里是针对二叉树中堆结构的顺序储存,整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步
2022-11-13

MySQL的索引在Python中如何合理创建和使用?(Python环境下如何为MySQL数据库合理创建和使用索引?)

在Python中为MySQL表创建和使用索引可以提高查询性能。使用create_index()方法创建索引,并使用filter()方法强制查询使用特定索引。最佳实践包括在经常用于where子句的列上创建索引,避免在经常更新的列上创建索引,并定期分析索引使用情况。Python提供内置函数get_indexes()、drop_index()和has_index()来管理索引。
MySQL的索引在Python中如何合理创建和使用?(Python环境下如何为MySQL数据库合理创建和使用索引?)
2024-04-02

使用Python脚本添加新的相关节点到arxml文件中的指定位置

使用Python脚本添加新的相关节点到arxml文件中的指定位置 1 背景 随着汽车软件开发的复杂度越来越高,链路越来越长,很多手动配置的工具链所需要的时间就会被拉长,显然这对于项目的开发进度有了一定影响,根据需求自动化生成arxml文件其
2023-08-30

使用python的netCDF4库读取.nc文件 和 创建.nc文件

  使用python netCDF4库读取.nc文件 和 创建.nc文件  1. 介绍  .nc(network Common Data Format)文件是气象上常用的数据格式,python上读取.nc使用较多的库为netCDF4这个库,
2023-06-02

怎么使用Python和Tkinter创建一个简单的闹钟程序

这篇文章主要介绍了怎么使用Python和Tkinter创建一个简单的闹钟程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Python和Tkinter创建一个简单的闹钟程序文章都会有所收获,下面我们一起
2023-07-05

Python中如何对MySQL的表结构进行动态创建和修改?(使用Python如何动态地创建和修改MySQL的表结构?)

本文介绍了使用Python对MySQL表结构进行动态创建、修改和获取的方法。使用MySQLdb或pymysql库可通过执行SQL语句来实现上述操作。SQLAlchemyORM提供了另一种便捷的方式。通过获取表的元数据,可以动态获取表结构。最后,本文展示了使用SQLAlchemy动态创建、修改和删除表结构的示例代码。
Python中如何对MySQL的表结构进行动态创建和修改?(使用Python如何动态地创建和修改MySQL的表结构?)
2024-04-02

Windows系统下使用flup搭建Nginx和Python环境的方法

首先确保你的电脑里已经安装了Python和Django,接下来我们还需要两个组件,nginx服务器和flup(Python的FastCGI组件) nginx下载地址:http://nginx.org/en/download.html flu
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录