neo4j目前是图数据库的主流,neo4j的Cypher语法简单直观,但是不便于流程化。如果习惯在python环境下处理数据,那么还是要用到python的neo4j库,即py2neo.

py2neo本身并不复杂,但要先适应它的思考模式。另一个问题是py2neo文档的示例较少,而且不同版本的py2neo挺不相同,容易弄混。这里要讲的是目前的v4版本。

连接数据库和图

from py2neo import *           # *中常用的是Node,Relationship,Graph
graph = Graph(url,username='name',password='pw')

2.查看数据库的基本属性

graph.schema.node_labels       # 查看图结构中节点标签的类别,返回结果是一个frozensetgraph.schema.relationship_types   # 查看图结构中关系的类型

3.数据操作

数据操作分为两种方式,一种是直接传入cypher语句,这里我们称之为cypher外壳;另一种是采用py2neo自己的数据结构和编写方式,我们称为py2neo方法。

在讲这两种方式之前,先提一下通用的pull()、push()等操作。

因为常需要从服务器端取数据,同时编写程序时本地也会产生Node,Relationship等数据,因此需要二者的版本协同。常规的处理方法如下:

graph = Graph()
tx  = graph.begin()          # 开始一个Transaction
node_1 = Node("Person",name="Peter")
tx.create(node_1)
tx.push(node_1)              # push到服务器
#or
tx.commit()             # 将以上更改一次提交

3.1 cypher外壳

这种方法的基本用法是graph.run(‘a cypher expression’),如

result =graph.run('match (p:Paper) return p.title,p.author limit 20')

适合更熟悉Cypher语法的同学使用,需要注意的是,运行graph.run()返回的结果是一个cursor对象。cursor相当于结果的一个游标(a cursor is a navigator for a stream of records).可以通过循环调用。

while cursor.forward():print(cursor.current['name'])
# or
for record in cursor:print(record["name"])

此外graph.run()的结果可以通过数据形式呈现。数据基本格式是list of dictionary,可以按需求转换为其它格式:

graph.run().data()               # a list of dictionary
graph.run().to_data_frame()      # pd.DataFrame
graph.run().to_ndarray()         # numpy.ndarray
graph.run().to_subgraph()
graph.run().to_table()

3.2 py2neo方法

py2neo方法即前面的graph类中的函数。neo4j的主要功能是图数据的存储和查询,相应的py2neo方法也可以从这两方面来考察。

(1)存储

除了前面的创建节点,还有创建关系以及子图。

a = Node("Person",name="Alice")
b = Node("Person",name="Bob")
r = Relationship(a,"KNOWS",b)
s = a|b|r
graph = Graph()
graph.create(s)

创建节点可以采用merge方法,需要注意的是py2neo和cypher中的merge方法有所不同。

在cypher中,MERGE方式是当你创建一个实体时,程序会检测是否已有这个实体存在,检测的方法是进行label和property的匹配。如果已存在则不创建。 py2neo方法中的merge则是,同样进行匹配,如果匹配上则用当前实体覆盖数据库中的已有实体。 这里的主要区别在于,匹配时一般只会用到关键的少数property,根据某个property去决定是否覆盖时,其他property可能是不相等的。

因此cypher是用数据库实体覆盖新创建的,py2neo是用新的覆盖旧的。 考虑到创建时属性可能比较少,因此在py2neo中慎用merge,可以先做存在判断,然后再用create语句.

具体的,merge语句的使用方式为:

graph.merge(node_1,"Person","name")       # 根据name属性对person结点进行merge

相应的cypher语句中的merge为:

match (c:course)
merge (t:teacher {name:c.teacher})
return c.name,c.teacher

(2)查询

py2neo提供了专门的查询模块,即NodeMatcher和RelationshipMatcher,使用格式为

matcher_1 = NodeMatcher(graph)
matcher_2 = RelationshipMatcher(graph)
node = matcher_1.match("Paper",ID='09076').where(year=2017)  # 匹配指定ID和year的Paper结点
relation = matcher_2.matcher(r_type="Cited").limit(50)

注意使用这两个模块后返回的结果仍然是NodeMatcher对象或RelationshipMatcher对象,要将其转换为实体,可以采用first()函数,或者变换成列表。

node_1 = matcher_1.match("Paper",ID='09076').first()    # 取第一个匹配到的节点
result_1 = list(node)           # 转换为列表
result_2 = list(result)

此外,node和relationship数据类型也自带匹配属性,如

graph.node.matcher("Person").first()

但是这样匹配的效率似乎比较低,运行更慢。

以上py2neo的匹配,其缺点在于匹配被人为分割成节点和关系的匹配,使用起来不灵活,因为节点和关系的匹配常常是紧密联系的。相比之下,cypher的原生匹配就很灵活,没有限定类型。

match g = (p1:Person) -[r:]->(p2:Paper)
where p2.year>2008
return g,p1.name,r.type,p2.title

3.3 py2neo.ogm

py2neo中的ogm模块是Object-Graph Mapping的简写,这里将它和普通py2neo方法分开单独讲,ogm是基于Graphobject的。

一个Graphobject的实例可以包含节点、标签或相关对象等内容。

class Movie(GraphObject):__primarylabel__ = 'Movie'__primarykey__ = 'title'title = Property()              # 影片名tag_line = Property('tagline')  release = Property()            # 发行时间restricted = Lable()            # 是否限制级actors = RelatedFrom("Person","ACTED_IN")directors = RelatedFrom("Person","DIRECTED")producers = RelatedFrom("Person","PRODUCED")class Person(GraphObject):__primarykey__ = "name"name = Property()       acted_in = RelatedTo(Movie)

Property是属性,通过语句如release = Property()指定release为属性,接着就可以赋值

M = Movie()
M.release = 1995

Label是标签,用法同Property,但Label是binary变量。

RelationTo和RelatedFrom指定了关系管理的实体和关系的方向。

graphObject对象自身也可以进行查询操作,如Person.match(graph,“Alice”).first()

如前文所说,效率可能没有NodeMatcher方法高。

  1. 小结

以上就是笔者整理的py2neo基本使用方法,作为一个小工具,py2neo内容本身不多,但是限于篇幅,还有一些有用的内容没有涉及到。例如为实体添加特定约束等,有机会再写。

Py2neo的基本用法相关推荐

  1. py2neo 基本用法

    py2neo 基本用法 #coding:utf-8 from py2neo import Graph,Node,Relationship##连接neo4j数据库,输入地址.用户名.密码 graph = ...

  2. python使用Neo4j图数据库——py2neo详解(1)

    目录 0 前言 1 安装 2 py2neo.data 2.1 Node和Relation对象 2.2 Subgraph 2.3 Path对象和其他Walkable类型 2.4 Record对象 2.5 ...

  3. Neo4j简介及Py2Neo的用法

    Neo4j是一个世界领先的开源图形数据库,由Java编写.图形数据库也就意味着它的数据并非保存在表或集合中,而是保存为节点以及节点之间的关系. Neo4j的数据由下面3部分构成: 节点 边 属性 Ne ...

  4. Neo4j 操作与 py2neo 用法

    Neo4j是一个世界领先的开源图形数据库,由 Java 编写.图形数据库也就意味着它的数据并非保存在表或集合中,而是保存为节点以及节点之间的关系. Neo4j 的数据由下面几部分构成: 节点 边 属性 ...

  5. Py之py2neo:py2neo的简介、安装、使用方法之详细攻略

    Py之py2neo:py2neo的简介.安装.使用方法之详细攻略 目录 py2neo的简介 py2neo的安装 py2neo的使用方法 1.基础用法 py2neo的简介 py2neo是一个客户端库和工 ...

  6. Neo4J Cypher neo4j-driver py2neo介绍与使用

    Neo4J Cypher neo4j-driver介绍与使用 neo4j介绍 关系型数据库和图数据库 图数据库的基本概念 Nodes Labels Relationship RelationshipT ...

  7. 【neo4j】Neo4j-Cypher、py2neo常用操作整理

    目录 Cypher 1.创建 2.查询 3.修改 4.排序 ORDER BY 5.导入csv文件(load csv) 6.索引 py2neo 1.连接数据库 2.创建节点 3.创建关系 4.查询节点 ...

  8. 知识图谱之py2neo

    py2neo介绍 介绍 Py2neo是一个客户端库和工具包,用于从Python应用程序和命令行使用Neo4j(Neo4j Graph Data Platform | Graph Database Ma ...

  9. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

最新文章

  1. elasticsearch-.yml(中文配置详解)
  2. 我拷贝大文件的时候报“超过文件大小限制”错误,怎样突破这个限制?
  3. 阿里云数据库产品HybridDB简介——OLAP数据库,支持行列混合存储,为用户提供基于开源 OLTP、OLAP、BigData 生态的一站式解决方案...
  4. 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )
  5. 直播丨BMMeetup第2期:大模型计算加速技术,2场特邀和7位青年学者技术报告联袂上演...
  6. linux中echo命令不输出换行,shell脚本echo输出不换行功能增强实例
  7. DB2 9 底子(730 考试)认证指南,第 3 局部: 拜访 DB2 数据(3)
  8. 2027. 转换字符串的最少操作次数
  9. 前端学习(1364):学生档案信息管理6
  10. linux find命令mtime/atime/ctime +n -n n 全网最正确的总结
  11. java自己实现linkedlist_自己根据java的LinkedList源码编写的一个简单的LinkedList实现...
  12. word手动设置编号起始值
  13. python实现栅栏密码加解密
  14. C语言用什么 IDE 好 - 除了 Visual Studio、VSCode、CLion 还有什么其他选择?
  15. java 斜杠常量_Java基础之常量
  16. 程序员外包工作3年,跳槽却没人要,网友:你也太老实了吧
  17. ABP Vnext 5.0 EF6Core适配Oracle 解决方案
  18. java中\是什么意思?
  19. 【java毕业设计】基于javaEE+SSH+oracle的健康管理系统设计与实现(毕业论文+程序源码)——健康管理系统
  20. 微信小程序服务器错误错误码404,微信小程序 云开发 错误代码 大全

热门文章

  1. word文档通配符换行_Word中有哪些实用技巧?Word文件怎么转换成PDF文件?
  2. 我38岁被裁,本以为稳进Top3,今天是失业第42天
  3. java-net-php-python-MES生产线控制系统计算机毕业设计程序
  4. snmptrap、snmpinform和snmptrapd的详细介绍及其用法
  5. 记一次 React 开源甘特图组件的性能优化,已合入 PR!
  6. linux安装配置tinyproxy
  7. Log4j配置输出log文件的相对路径
  8. 按位与,按位或,按位异或的理解
  9. 计算机中的树(来自百度百科)
  10. 宽带路由器上的“转发规则”功能用途及设置办法 -- LAN与WAN通信的IP转换