python3.7对象检测(在Python中使用Neo4j的方法)
python3.7对象检测
在Python中使用Neo4j的方法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( " <{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 层。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/u010159842/article/details/78128823
- python3html怎么转换成pdf(Python实现html转换为pdf报告生成pdf报告功能示例)
- python排序的三种方法(Python实现插入排序和选择排序的方法)
- python把文件上传服务器(Python 实现两个服务器之间文件的上传方法)
- python pyqt 教程(Python+PyQt5实现美剧爬虫可视工具的方法)
- python如何使用yield(YII2.0框架行为Behavior深入详解)
- pythonflask系列教程(Python安装Flask环境及简单应用示例)
- vscode如何配置python环境(VSCode Python开发环境配置的详细步骤)
- python协程详解(为什么你还不懂得怎么使用Python协程)
- eval详解python(深度辨析Python的eval与exec的方法)
- python pandas dataframe 查询(Python实现从SQL型数据库读写dataframe型数据的方法基于pandas)
- python处理excel基础教程第3讲(Python Excel处理库openpyxl使用详解)
- 用python简单实现登录功能(使用python的pexpect模块,实现远程免密登录的示例)
- python抽奖转盘代码(详解python--模拟轮盘抽奖游戏)
- python怎么测试api接口(python接口自动化测试之接口数据依赖的实现方法)
- 微信公众号文章 爬虫(python抓取搜狗微信公众号文章)
- python装饰器使用说明(详解Python装饰器)
- 节日我在岗|警景相融 平安相伴(节日我在岗警景相融)
- 战 疫 时刻 致敬每一位石化大学的 守护者(战疫时刻)
- 老弄堂里的市井味道(老弄堂里的市井味道)
- 小米音乐可绑定QQ音乐, QQ音乐 真的会消失在小米的设备上吗(小米音乐可绑定QQ音乐)
- 小米Watch S1评测 或许能成为小米冲击高端可穿戴设备的里程碑(小米WatchS1评测或许能成为小米冲击高端可穿戴设备的里程碑)
- 手机QQ与小米路由器在一起 明天揭晓,敬请期待(手机QQ与小米路由器在一起)
热门推荐
- vscode如何配置python环境(VSCode Python开发环境配置的详细步骤)
- php解读三重境界(PHP 观察者模式深入理解与应用分析)
- 如何保证幂等性(聊聊幂等性如何保证的)
- javascript作用域实例(JavaScript defineProperty如何实现属性劫持)
- python中列表remove的用法汇总(对python_discover方法遍历所有执行的用例详解)
- mysql 安装阿里云(详解如何在阿里云服务器安装Mysql数据库)
- 正则表达式在python的中的应用(Python中正则表达式的用法总结)
- Web安全色
- html5播放器按菜单键没反应(解决HTML5中的audio在手机端和微信端的不能自动播放问题)
- php中怎么判断变量类型(PHP INT类型在内存中占字节详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9