Python使用Py2neo创建Neo4j的节点、关系及路径

目录
  • 一、安装Py2neo
  • 二、连接Neo4j数据库
    • 1. 使用graph.run执行Cypher语句创建节点
    • 2. 使用Node数据结构创建节点
    • 3. 使用Node、Relationship和Subgraph数据结构创建节点和关系
  • 三、性能对比

一、安装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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    一.连接Neo4j数据库 本文中会用到多种数据类型,在此一并引用 <import numpy as np import pandas as pd from py2neo import Node,Relationship,Graph,Path,Subgraph from py2neo import NodeMatcher,RelationshipMatcher 配置Neo4j数据库的访问地址.用户名和密码: neo4j_url = '访问地址' user = '用户名' pwd = '密码' 在此

  • Python time.time()方法

    目录 描述 返回值 实例 备注 总结 描述 Python time time()返回当前时间的时间戳(1970纪元后经过的浮点秒数). 突然想看时间了,打开cmd发现脑中空荡,Java和Python的Time类全忘了,我留下了无助的眼泪o(╥﹏╥)o. 语法 time()方法语法: time.time() 返回值 返回当前时间的时间戳(1970纪元后经过的浮点秒数). 实例 以下实例展示了 time() 函数的使用方法: #!/usr/bin/python import time print "

  • Python使用py2neo操作图数据库neo4j的方法详解

    本文实例讲述了Python使用py2neo操作图数据库neo4j的方法.分享给大家供大家参考,具体如下: 1.概念 图:数据结构中的图由节点和其之间的边组成.节点表示一个实体,边表示实体之间的联系. 图数据库:以图的结构存储管理数据的数据库.其中一些数据库将原生的图结构经过优化后直接存储,即原生图存储.还有一些图数据库将图数据序列化后保存到关系型或其他数据库中. 之所以使用图数据库存储数据是因为它在处理实体之间存在复杂关系的数据具有很大的优势.使用传统的关系型数据库在处理数据之间的关系时其实很不

  • python利用文件读写编写一个博客

    代码展示 import random import json import time import os     def zhuce():     print("*********************正在注册*********************")     try:         users = readfile()     except:         fa = open(r'test.json', "w",encoding="utf-8&

  • Python接口自动化之接口依赖

    目录 一.场景说明 二.token处理思路 三.JsonPath基本用法 1.JsonPath介绍 2.JsonPath语法 3.JsonPath源码 4.JsonPath实战 四.token依赖实例 ⑤接下来编写函数,获取登录接口返回值并提取token和token_type进行拼接 .这里要使用jsonpath模块提取返回的token和token_type. ⑥最后定义类,将token作为类属性,整体代码如下: ⑦充值接口携带token请求. 总结: 一.场景说明 在面试接口自动化时,经常会问

  • 手把手带你用python爬取小姐姐私房照

    目录 如何用Python搞到小姐姐私房照 目标站点 开发环境 效果预览 正式教程 一.第三方库安装 二.爬虫的基本套路 分析目标站点 请求网站获取数据 解析数据 保存数据 写在最后 如何用Python搞到小姐姐私房照 本文纯技术角度出发,教你如何用Python爬虫获取百度图库海量照片--技术无罪. 学会获取小姐姐私房照同理可得也能获取其他的照片,技术原理是一致的. 目标站点 百度图片使用关键字搜索 小姐姐私房照 https://image.baidu.com/ 开发环境 系统:Windows10

  • python中bottle使用实例代码

    模仿学习同事的代码来写的,主要是搞懂python中如何来组织包,如何调用包,如何读取配置文件,连接数据库,设置路由,路由分组.(注:使用的是python3.6) 整体目录设计如下: 根据调用层级从上往下来说: 首先项目根目录下的main.py是整个程序的入口,主要作用启动http服务器,调用分组路由. main.py import bottle from confg.conf import CONF from api.user import User db_url = CONF.db.url d

  • python使用py2neo创建neo4j的节点和关系

    1.核心代码 使用py2neo连接neo4j的方法: from py2neo import Graph graph = Graph("http://localhost:7474", auth=("neo4j", "neo4j")) graph.delete_all()  # 删除已有的所有内容 根据dict创建Node: from py2neo import Node node = Node(**{"key":"va

  • Python使用Py2neo创建Neo4j的节点、关系及路径

    目录 一.安装Py2neo 二.连接Neo4j数据库 1. 使用graph.run执行Cypher语句创建节点 2. 使用Node数据结构创建节点 3. 使用Node.Relationship和Subgraph数据结构创建节点和关系 三.性能对比 一.安装Py2neo 使用pip安装Py2neo,执行: pip install py2neo 查看已安装的Py2neo是什么版本的: pip show py2neo 二.连接Neo4j数据库 本文中会用到多种数据类型,在此一并引用 import nu

  • python 实现查询Neo4j多节点的多层关系

    需求:查询出满足3人及3案有关系的集合 # -*- coding: utf-8 -*- from py2neo import Graph import psycopg2 # 二维数组查找 def find(target, array): for i, val in enumerate(array): for j, temp in enumerate(val): if temp == target: return True; return False graph = Graph(host="192

  • Python探索之创建二叉树

    问题 创建一个二叉树 二叉树有限多个节点的集合,这个集合可能是: 空集 由一个根节点,和两棵互不相交的,分别称作左子树和右子树的二叉树组成 创建二叉树,创建节点,再创建节点之间的关系 Python代码示例 # !/usr/bin/env python # -*-encoding: utf-8-*- # author:LiYanwei # version:0.1 class TreeNode(object): def __init__ (self, data, left = None, right

  • Python算法之求n个节点不同二叉树个数

    问题 创建一个二叉树 二叉树有限多个节点的集合,这个集合可能是: 空集 由一个根节点,和两棵互不相交的,分别称作左子树和右子树的二叉树组成 创建二叉树: 创建节点 再创建节点之间的关系 Python代码示例 # !/usr/bin/env python # -*-encoding: utf-8-*- # author:LiYanwei # version:0.1 class TreeNode(object): def __init__ (self, data, left = None, righ

  • python类:class创建、数据方法属性及访问控制详解

    在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象. python中创建类 创建一个Student的类,并且实现了这个类的初始化函数"__init__": class Student(object):     count = 0     books = []     def __init__(self, name):         self.name = name 接下来就通过上面的Student类来看看Python中类的相关内容. 类构造和

  • Python中集合创建与使用详解

    目录 一.集合 二.如何创建集合? 三.如何访问集合中的值? 四.不可变集合 五.如何确定一个集合里有多少个元素? 六.python 集合类型的所有内置方法总结表,仅供参考. 总结 一.集合 在 python 中用 {} 扩起一堆数字,但是这堆数字没有体现映射关系,那么这堆数字就是一个集合. 集合的特色: 集合在 python 中起到的唯一的作用就是,“唯一”. 重新赋值 num2,重复的数都会自动被剔除,这就是唯一.集合里所有的元素都是唯一的,它都具有唯一性.集合直接帮我们把重复的数据清理掉.

  • python之sqlalchemy创建表的实例详解

    python之sqlalchemy创建表的实例详解 通过sqlalchemy创建表需要三要素:引擎,基类,元素 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String 引擎:也就是实体数据库连接 engine = create_engine('mysql+pymysql://go

随机推荐