赞
踩
让我们直接看看代码。下面是一个完整的小型应用。这个程序允许添加新的名字与一个或者更多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)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。