解读Neo4j全新的Python驱动程序
尽管Neo4j社区目前已发布了Java、Python、JavaScript和.NET官方支持的驱动程序,但其发展并未停步。本周,Neo4j发布驱动程序py2neo 3.1版本,同时还为Python用户推出了全新的OGM。
OGM(Object-Graph Mapper)和图形数据库的关系,就相当于ORM(对象关系映射)和传统RDMS之间的关系:前者都是一个架构,可供构建database-aware领域对象(domain objects)。
Py2neo OGM的操作围绕新的GraphObject类展开。此处其扮演基础类和管理者的双重角色:前者限定了领域对象;后者则支持基础节点和使py2neo OGM持久化的相关平台。
借Movie Graph(和Neo4j预先打包)为例,以该数据集为基础,模拟一个Person类:
class Person(GraphObject):
__primarykey__ = "name"
name = Property()
born = Property()
此处,一个Person类有两类属性。而Neo4j的属性没有固定类型,因此,比起典型ORM下的SQL字段,其相关定义较少。
类属性和基础属性名称相同:命名和生成。必要时,其可重定向为不同名属性,含表达式例如Property(name="actual_name")。
最终,定义一个主键(primarykey),指出哪种属性是push和pull操作的唯一标识符;定义一个primarylabel,尽管是默认条件,仍可用Person代替。
综上所述,可以通过一个Cypher statement,挑选出一个特定Person对象节点:
MATCH (a:Person) WHERE a.name = {n} RETURN a
此外,如果想要在同一个数据集内,模拟Person和Movie,还有其关联平台,可通过以下途径:
class Movie(GraphObject):
__primarykey__ = "title"
title = Property()
tagline = Property()
released = Property()
actors = RelatedFrom("Person", "ACTED_IN")
directors = RelatedFrom("Person", "DIRECTED")
producers = RelatedFrom("Person", "PRODUCED")
class Person(GraphObject):
__primarykey__ = "name"
name = Property()
born = Property()
acted_in = RelatedTo(Movie)
directed = RelatedTo(Movie)
produced = RelatedTo(Movie)
此处包含两类新属性:RelatedTo和RelatedFrom。这两类属性定义了关系对象集(连接方式相似)。换句话说,就是它们共享相同的开始节点或终止节点,和共同的关系类型。
以acted_in = RelatedTo(Movie)为例,它描述了一组Movie关系节点集,这些节点都是通过一个输出ACTED_IN关系来连接的。这里要注意的是,和上面提及的属性命名一样,关系类型也默认自动匹配属性名,只不过此处字母为大写形式。相反,对应的反向定义,actors = RelatedFrom("Person", "ACTED_IN")则明指定了关系名,以区分与属性名的差异。
为了研究执行对象的方法,可以假设一个情境:需要从数据库中提取出Keanu Reeves,并将他和经典影片Bill & Ted’s Excellent Adventure相连接 (不包含在原始图当中)。在这种情况下,首先要利用GraphObject类,并通过Person子类选择演员。随后,构建一个新的Movie对象,并添加到Keanu Reeves参与演出的影片集当中。最终,将上述全部信息汇入图表中。进程代码如下:
keanu = Person.select(graph, "Keanu Reeves").first()
bill_and_ted = Movie()
bill_and_ted.title = "Bill & Ted's Excellent Adventure"
keanu.acted_in.add(bill_and_ted)
graph.push(keanu)
通过一个类似集的端口(提供添加和移除方法),关系对象支持其父类对象。这些数据汇入图表之后,为了完成操作,OGM架构自动构建并运行所有必要的Cypher。
该方法也可用于执行其它更复杂的选择。Where
method可利用所有WHERE
子句中的expression。比如要输出所有名字首字母是“K”的演员,操作如下:
for person in Person.select(graph).where("_.name =~ 'K.*'"):
print(person.name)
注意:此处用到下划线字符来指代待匹配节点。
Py2neo文档还包含很多其它信息,且GitHub知识库当中还有一个演示应用程序,该程序展示了一个微型movie浏览器(截图如下)当中,一切是如何运行的。
- 使用Spring Cloud Feign上传文件
- 用 TensorFlow 让你的机器人唱首原创给你听
- Spring Cloud限流详解(附源码)
- 手动安装Docker 17.06
- 详述使用 IntelliJ IDEA 解决 jar 包冲突的问题
- Spring Cloud各组件重试总结
- js或者php浮点数运算产生多位小数的理解
- 纠错帖:Zuul & Spring Cloud Gateway & Linkerd性能对比
- 你知道 Python 这五个有趣的彩蛋吗?
- [图解DS基础概念]Critical value,Alpha,Z-score,P-value 关系
- Docker系列教程02-Docker安装(CentOS7/Ubuntu/macOS/Windows)
- Docker系列课程01-Docker简介
- document.ready 与 window.onload的区别
- react+redux+webpack教程1
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法