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_functionimportsysfrompy2neoimportneo4j,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)) foremailin
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)forpersonin
cls._root.match(\"PERSON\")] def
__init__(self,node):
self._node=node def
__str__(self): returnself.name+\"\\n\"+
\"\\n\".join(\" <{0}>\".format(email)foremailin
self.emails) @property def
name(self): return
self._node[\"name\"] @property def
emails(self): return
[rel.end_node[\"email\"]forrelin
self._node.match(\"EMAIL\")]if
__name__==
\"__main__\": if
len(sys.argv)<2:
app=
sys.argv[0] print(\"Usage:
{0} add [ {0} list\".format(app)) sys.exit() method= sys.argv[1] if method==\"add\": print(Person.create(*sys.argv[2:])) elifmethod==\"list\": forpersonin 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 层。总结 以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。如果你想了解更多相关内容请查看下⾯相关链接 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务