在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用reduce和map把字符串转为数字的方法
Dec 19 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
Python中pandas dataframe删除一行或一列:drop函数详解
Jul 03 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
Python 实现OpenCV格式和PIL.Image格式互转
Jan 09 Python
浅析Python面向对象编程
Jul 10 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 Python
python图片灰度化处理的几种方法
Jun 23 Python
一篇文章弄懂Python中的内建函数
Aug 07 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
2016/01/26 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
react-native fetch的具体使用方法
2017/11/01 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
基于django传递数据到后端的例子
2019/08/16 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
战友聚会邀请函
2014/01/18 职场文书
销售人员自我评价
2014/02/01 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript