在Python中使用Neo4j的方法


Posted in Python onMarch 14, 2019

Neo4j是面向对象基于Java的 ,被设计为一个建立在Java之上、可以直接嵌入应用的数据存储。此后,其他语言和平台的支持被引入,Neo4j社区获得持续增长,获得了越来越多的技术支持者。目前已支持.NET、Ruby、Python、Node.js及PHP等。因此,不管是什么项目,没有理由不引入Neo4j。

本文重点介绍Python,这门语言的哲学与Java大大不同,同时展示py2neo库如何被用来建立一个简单的应用程序。

一个快速的REST例子

首先来看些基本知识。如果没有服务API,Neo4j就不能支持其他语言。该接口提供一组基于JSON消息格式的RESTful Web服务和一个全面的发现机制。使用中使用这个接口的最快和最容易的方法是通过使用cURL:

$ curl http://localhost:7474/db/data/
{ 
 "extensions" : { 
 }, 
 "node" : "http://localhost:7474/db/data/node", 
 "node_index" : "http://localhost:7474/db/data/index/node", 
 "relationship_index" : "http://localhost:7474/db/data/index/relationship", 
 "extensions_info" : "http://localhost:7474/db/data/ext", 
 "relationship_types" : "http://localhost:7474/db/data/relationship/types", 
 "batch" : "http://localhost:7474/db/data/batch", 
 "cypher" : "http://localhost:7474/db/data/cypher", 
 "transaction" : "http://localhost:7474/db/data/transaction", 
 "neo4j_version" : "2.0.0-M03" 
}

从这个端点返回JSON对象包含一组资源名称和URI下可以找到的Cypher端点。在消息载荷中接受传送来的Cyper请求并执行这些查询,在HTTP响应中返回结果。

正是这种REST API接口,使得现在已有的各种Neo4j驱动得以建立。py2neo提供了这些REST资源的简单封装,这使Python应用程序开发者可以放心使用Neo4j而不用考虑底层的客户机-服务器协议。

一个简单的应用

为实际验证py2neo,我们将着眼于建立一个简单的用于存储姓名和电子邮件地址的通讯录管理系统。我们自然会使用节点来模拟每一个独立实体,但它是要记住,Neo4j没有类型的概念。类型是从周围的关系和属性推断来的。

下面的关系图中人显示为红色、电子邮件地址节点显示为蓝色。这些当然是纯粹的逻辑演示节点,但数据本身并没有区别。

在Python中使用Neo4j的方法

我们的应用程序将完成两个功能:添加新的联系人信息和检索联系人的完整列表。为此,我们将创建一个Person类包装Py2neoNodeobject,这使我们有一个底层处理的实现且留出用户级的功能。上图中的ROOT节点是指上图中一个固定的参考点,我们沿着这个点开始。

让我们直接看看代码。下面是一个完整的小型应用。这个程序允许添加新的名字与一个或者更多email地址相连接的以及提供了一个容易的方式来显示这些连接信息的一个命令行工具。没有参数的运行是显示使用模式,而且这个唯一的依赖只是需要一个本地未修改的Neo4j实例(instance)而已。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from
__future__
import
print_function
import
sys
from
py2neo
import
neo4j,
node,
rel
graph_db
=
neo4j.GraphDatabaseService()
class
Person(object):
  _root
=
graph_db.get_or_create_indexed_node("reference",
"contacts",
"root")
  @classmethod
  def
create(cls,
name,
*emails):
    person_node,
_
=
graph_db.create(node(name=name),
       rel(cls._root,
"PERSON",
0))
    for
email
in
emails:
      graph_db.create(node(email=email),
rel(cls._root,
"EMAIL",
0),
         rel(person_node,
"EMAIL",
0))
    return
Person(person_node)
  @classmethod
  def
get_all(cls):
    return
[Person(person.end_node)
for
person
in
       cls._root.match("PERSON")]
  def
__init__(self,
node):
    self._node
=
node
  def
__str__(self):
    return
self.name
+
"\n"
+
"\n".join(" <{0}>"
.format(email)
for
email
in
self.emails)
  @property
  def
name(self):
    return
self._node["name"]
  @property
  def
emails(self):
    return
[rel.end_node["email"]
for
rel
in  
self._node.match("EMAIL")]
if
__name__
==
"__main__":
  if
len(sys.argv)
<
2:
    app
=
sys.argv[0]
    print("Usage:
 {0} add <name> <email>
       [<email>...]".format(app))
    print("   
 {0} list".format(app))
    sys.exit()
  method
=
sys.argv[1]
  if
method
==
"add":
    print(Person.create(*sys.argv[2:]))
  elif
method
==
"list":
    for
person
in
Person.get_all():
      print(person)
  else:
print("Unknown
 command")

在第09行上是第一行Py2neo代码,用来创建了一个GraphDatabaseService对象。通过这个,我们就可以访问使用Neo4j server的大多数功能。可选一个URI传递到这个构造器里,尽管如果什么都没有提供,代而取之的是使用默认的本地参数。也就是说下面两行是完全相等的:

graph_db
=
neo4j.GraphDatabaseService()
graph_db
=
neo4j.GraphDatabaseService
(http://localhost:7474/db/data/)

第13行介绍了调用了get_or_create_indexed_node,它提供一种在图形里创建固定引用点的漂亮方式。传统的Neo4j索引允许节点和关系通过键值对访问,而在这个代码里我们使用了带连接的关键字和root值的引用索引实例。在第一次执行时,会创建一个新的节点,而且在随后的执行中,这个节点(即root)会复用(reused)。

在第17行,我们看见了推荐的节点和关系抽象的标记,以及接受和使用节点和关系抽象的create方法。任意多的抽象都可以被传递到这个方法中,并且在单个批处理转换中创建实体并以指定它们的顺序作为一个列表返回。抽象节点用节点函数表示并带有一些属性,然而抽象关系使用rel函数接受一个起始节点,类型和终止节点。上下文中,其他节点,关系起始和终止节点可能整合引用到在其他批处理中其他节点。在我们的例子中,我们把根节点连接到新创建的person节点,否则就作为项目0(item 0)了。

这次我们在第24行和38行上以match方法形式和关系见面[@Lesus 注: oschina代码行数有问题。对应于本文的第28和44行]。它试图使用一个特殊的条件集合(set)标识关系,然后使用列表(list)返回它们。这这些示例中,这个关系和PERSON关系相匹配,从root节点和EMAIL关系开始到所给定的person节点。和Cypher很相似,用来查询包含MATCH关键字的场景。

最后值得注意的一点是在上面的代码中访问节点属性的方式只是其中一种简单的方式。Py2neo重写了标准python的__getitem__和 __setitem__方法,通过方括号标识来方便访问任何属性。这点在第34和38行上可以看到。[@Lesus 注:对应于本文的第39和44行]

小结

在那里(代码行34和38)我们这样做了,这显示了它是如何快速简易地在JAVA环境之外拼凑出一个Neo4j应用程序,也显示了Py2neo是如何通过REST API来抽象出大多数沉重的负担。这里的例子并没有解决唯一性,尽管功能上提供了唯一索引和Cypher CREATE UNIQUE语句。Django开发者可能也想要考虑一个层,如Neomodel,它在Py2neo顶层上表示了一个Djangoesque ORM-style 层。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python sys.argv用法实例
May 28 Python
使用Python实现一个栈判断括号是否平衡
Aug 23 Python
对pandas的算术运算和数据对齐实例详解
Dec 22 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
python 使用while写猜年龄小游戏过程解析
Oct 07 Python
python中的函数递归和迭代原理解析
Nov 14 Python
Python序列类型的打包和解包实例
Dec 21 Python
python正则表达式匹配IP代码实例
Dec 28 Python
Django表单提交后实现获取相同name的不同value值
May 14 Python
python实现图片,视频人脸识别(dlib版)
Nov 18 Python
python之基数排序的实现
Jul 26 Python
浅谈Python中eval的强大与危害
Mar 13 #Python
详解python中init方法和随机数方法
Mar 13 #Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 #Python
python ---lambda匿名函数介绍
Mar 13 #Python
Python实现的列表排序、反转操作示例
Mar 13 #Python
Python实现的调用C语言函数功能简单实例
Mar 13 #Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 #Python
You might like
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
document.documentElement和document.body区别介绍
2013/09/16 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
几行js代码实现自适应
2017/02/24 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
python 提取文件的小程序
2009/07/29 Python
python的绘图工具matplotlib使用实例
2014/07/03 Python
python对象及面向对象技术详解
2016/07/19 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
pytorch permute维度转换方法
2018/12/14 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
工商管理实习生自我鉴定范文
2013/12/18 职场文书
大学毕业自我鉴定范文
2014/02/03 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
python tkinter实现定时关机
2021/04/21 Python
Python学习之包与模块详解
2022/03/19 Python
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫