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没有类型的概念。类型是从周围的关系和属性推断来的。

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

我们的应用程序将完成两个功能:添加新的联系人信息和检索联系人的完整列表。为此,我们将创建一个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(" "

.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

[...]".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 neo4j_在Python中使用Neo4j的方法相关推荐

  1. python添加自定义模块_Python中添加自定义模块的方法

    Python中添加自定义模块的方法 发布时间:2020-07-17 14:01:03 来源:亿速云 阅读:95 作者:小猪 这篇文章主要讲解了Python中添加自定义模块的方法,内容清晰明了,对此有兴 ...

  2. python end用法_python中end的使用方法

    python中end的使用方法 发布时间:2020-06-17 09:47:13 来源:亿速云 阅读:178 这篇文章给大家分享的是有关python中end的使用方法,小编觉得挺实用的,因此分享给大家 ...

  3. python 字符串拼接_Python中拼接字符串的方法 | 萧小寒

    摘要 在编程语言中,几乎每种语言都有关于字符串的操作方法或函数.原因很简单,字符串做为编程语言中不可或缺的数据类型,有着不可以替代的重要性.不同的是,每种编程语言对于字符串的处理方式都有自己的特色.这 ...

  4. python accept解析_python中requests库使用方法详解

    一.什么是Requests Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库.它⽐ urllib 更加⽅便,可以节约我们⼤量的 ...

  5. python如何撤销_python 中使用函数的方法取消转义

    图片 问题原因解析: 因为目录文件是需要转义的, 所以会显示出无法删除本地目录的错误, 对于目录文件取消自动转义, 在 python 中除了 R 之外, 还有什么方法? 我们不妨调用一个函数来取消转义 ...

  6. python去重复元素_Python实现去除列表中重复元素的方法总结【7种方法】

    这里首先给出来我很早之前写的一篇博客,Python实现去除列表中重复元素的方法小结[4种方法],感兴趣的话可以去看看,今天是在实践过程中又积累了一些方法,这里一并总结放在这里. 由于内容很简单,就不再 ...

  7. pdf exe如何提取pdf文件_python应用:如何用python提取pdf文件中的文字

    从pdf中提取文字,相信很多人都干过这事,怎么在python中实现呢,今天带大家看看. 第一步导入库 import PyPDF2 第二步导入pdf文件 pdf_file =open('dataset/ ...

  8. python替换文件内容_Python实现替换文件中指定内容的方法

    本文实例讲述了Python实现替换文件中指定内容的方法.分享给大家供大家参考,具体如下: 这里使用python编写的程序,实现如下功能:将文件中的指定子串 修改为 另外的子串 编写的python程序, ...

  9. Python:PIL库中getpixel()-方法的使用

    Python:PIL库中getpixel()方法的使用 getpixel()函数是用来获取图像中某一点的像素的RGB颜色值,getpixel的参数是一个像素点的坐标.对于图象的不同的模式,getpix ...

最新文章

  1. Linux0.11小结
  2. Eclipse europa 更新时 Error retrieving feature.xml. [error in opening zip file]
  3. python string.format()_Python string.format()百分比,不取整
  4. MIN()与MAX()函数 的注意事项
  5. Oracle Rownum 伪列详解
  6. 引介 | RLP 编码和解码
  7. 21. 栈的压入、弹出序列
  8. Android应用程序插件化研究之DexClassLoader
  9. 一站式学习Redis 从入门到高可用分布式实践(慕课)第三章 Redis客户端
  10. html页面加载完成之后,网页加载时页面显示进度条加载完成之后显示网页内容...
  11. 《初识Scratch》教学设计
  12. ie11 华表_IE11网页加载项和控件不能运行的解决方法
  13. oracle exadata效果,exadata成功案例与性能测试-oracle.pdf
  14. SSM框架整合及详解
  15. 《淘宝技术这十年》之LAMP架构的网站
  16. 回望2022,依然值得仰望星空
  17. python中interval函数_python强大的区间处理库interval用法介绍
  18. ICMP隧道检测分析--icmptunnel
  19. MATLAB用相干解调DSB信号,AM DSB信号解调的MATLAB实现
  20. contiki学习笔记(三)contiki系统

热门文章

  1. python函数定义及调用-浅谈Python中函数的定义及其调用方法
  2. python中文版软件下载-Python中文版下载_PyCharm官方最新版下载_3DM单机
  3. 零基础学python用哪本书好-零基础想要学习Python编程 ,不知道看哪本书?
  4. ZS语音识别(智能语音识别工具)V1.3 绿色版
  5. element-ui 分页索引问题
  6. 高通骁龙cpu排行_最新手机性能排行榜出炉:高通骁龙865霸榜,前十不见华为!...
  7. 修改html本地样式,html-如何通过Javascript更改CSS类样式?
  8. MongoDB更新文档(非常详细,不要错过~)
  9. aes解密设置utf8 php,PHP aes (ecb)解密后乱码问题
  10. 【王道计组笔记】主存与CPU的连接