一个访客在Nigel Small公布的文章,他感兴味的范围包括Python、Javascript、PostgreSQL、Neo4j和Linux。他是一些开源项目的创始者,其中最有名的是py2neo,他是一个生动的博客、演说者及Neo4j社区成员。可以颠末@technige找到他。
Neo4j是面向Tools基于Java的 ,被设计为一个建立在Java之上、可以间接嵌入运用的数据存储。此后,其他言语和平台的支持被引入,Neo4j社区获得继续增加,获得了越来越多的技能支持者。目前已支持.NET、Ruby、Python、Node.js及PHP等。因此,不管是什么项目,没有因由不引入Neo4j。
本文重点引见Python,这门言语的哲学与Java大大不合,同时展示py2neo库怎样被用来建立一个轻易的运用次序。
首先来看些基本知识。假设没有处事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" }
从这个端点前去JSONTools包含一组本钱称呼和URI下可以找到的Cypher端点。在消息载荷中接受传送来的Cyper央求并实行这些查询,在HTTP照应中前去结果。
正是这类REST API接口,使得现在已有的各种Neo4j驱动得以建立。py2neo供应了这些REST本钱的轻易封装,这使Python运用次序开拓者可以担忧应用Neo4j而不用思考底层的客户机-Server协议。
为理论验证py2neo,我们将着眼于建立一个轻易的用于存储姓名和电子邮件地址的通讯录管理系统。我们自然会应用节点来模拟每一个自力实体,但它是要记取,Neo4j没有类型的观念。类型是从周围的关系和属性推断来的。
下面的关系图中人显示为白色、电子邮件地址节点显示为蓝色。这些当然是隧道的逻辑演示节点,但数据本身并没有差异。
我们的运用次序将完成两个功用:添加新的联系人信息和检索联系人的残缺列表。为此,我们将创建一个Person类包装Py2neoNodeobject,这使我们有一个底层处理的完成且留出用户级的功用。上图中的ROOT节点是指上图中一个结实的参考点,我们沿着这个点末尾。
让我们间接看看代码。下面是一个残缺的小型运用。这个次序容许添加新的名字与一个也许更多email地址相连接的和供应了一个随便的办法来显示这些连接信息的一个号召行Tools。没有参数的运转是显示应用方式,而且这个唯一的依托只是需求一个外地未修改的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 + " " + " ".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代码,用来创建了一个 GraphDatabaseServiceTools。颠末这个,我们就可以够访问应用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)。
此次我们在第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 层。
本文中的一切译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译Task依照 CC 协议,假设我们的Task有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务