在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去除字符串两端空格的方法
May 21 Python
Python编程中的for循环语句学习教程
Oct 14 Python
使用Python简单的实现树莓派的WEB控制
Feb 18 Python
Python之re操作方法(详解)
Jun 14 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
Apr 23 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
python爬虫要用到的库总结
Jul 28 Python
详解python的super()的作用和原理
Oct 29 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 Python
如何用python识别滑块验证码中的缺口
Apr 01 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源码之explode使用说明
2011/08/05 PHP
php-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
实现获取http内容的php函数分享
2014/02/16 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
php生成微信红包数组的方法
2019/09/05 PHP
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
python中字符串类型json操作的注意事项
2017/05/02 Python
简单了解什么是神经网络
2017/12/23 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
html5实现滑块功能之type=&quot;range&quot;属性
2020/02/18 HTML / CSS
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
《狐假虎威》教学反思
2014/02/07 职场文书
双创工作实施方案
2014/03/26 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
安全生产计划书
2014/05/04 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技