第 9 章 在 Python 应用中使用 Neo4j
目录
9.1. 你好,世界!
9.2. 一个使用遍历查询和索引的范例应用
要获取关于Python语言绑定的通用信息,请参考:python-embedded-installation。要获取关于如何在Python下安装Neo4j驱动的信息,请参考:python-embedded。
9.1. 你好,世界!
这是一个让你能开始使用的简单范例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | fromneo4j importGraphDatabase # Create a database db =GraphDatabase(folder_to_put_db_in) # All write operations happen in a transaction with db.transaction: firstNode =db.node(name='Hello') secondNode =db.node(name='world!') # Create a relationship with type 'knows' relationship =firstNode.knows(secondNode, name='graphy') # Read operations can happen anywhere message =' '.join([firstNode['name'], relationship['name'], secondNode['name']]) printmessage # Delete the data with db.transaction: firstNode.knows.single.delete() firstNode.delete() secondNode.delete() # Always shut down your database when your application exits db.shutdown() |
9.2. 一个使用遍历查询和索引的范例应用
要了解这里用到的一些概念的详细文档,请参考: python-embedded-reference-indexes 和 python-embedded-reference-traversal 。
这个范例展示了如何开始构建一些像使用Neo4j的简单缴费跟踪程序。
我们开始引入Neo4j,并创建一些我们将用来组织我们实际数据的meta数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | fromneo4j importGraphDatabase, INCOMING, Evaluation # Create a database db =GraphDatabase(folder_to_put_db_in) # All write operations happen in a transaction with db.transaction: # A node to connect customers to customers =db.node() # A node to connect invoices to invoices =db.node() # Connected to the reference node, so # that we can always find them. db.reference_node.CUSTOMERS(customers) db.reference_node.INVOICES(invoices) # An index, helps us rapidly look up customers customer_idx =db.node.indexes.create('customers') |
9.2.1. 域逻辑
然后我们定义一些我们的应用能执行的域逻辑。我们的应用有连个域对象,客户和缴费单。让我们创建一些方法来新增客户和缴费单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | defcreate_customer(name): with db.transaction: customer =db.node(name=name) customer.INSTANCE_OF(customers) # Index the customer by name customer_idx['name'][name] =customer returncustomer defcreate_invoice(customer, amount): with db.transaction: invoice =db.node(amount=amount) invoice.INSTANCE_OF(invoices) invoice.RECIPIENT(customer) returncustomer |
在客户这方面,我们创建一个新的节点来表示客户并把他连接到 客户集节点。这会帮助我们稍后查找客户以及判定节点是否表示是客户。
我们也用客户的名称做索引,为了能快速的通过客户的名字找到客户。
在缴费单这方面,我们也做相同的动作,除了没有索引。我们也连接一个新的缴费单到发送这个缴费单的客户节点上面,并定义这个关系的类型为:SENT_TO。
下一步,我们想能接收到我们新增的客户和缴费单。因为我们用了客户的名称做索引,因此找到他们是非常简单的。
1 2 | defget_customer(name): returncustomer_idx['name'][name].single |
让我们说我们也喜欢做一些类似于找到给定客户的所有大于某一金额的所有缴费单的事情。这应该通过写一个遍历查询器来完成,像下面这样:
1 2 3 4 5 6 7 8 9 10 11 12 | defget_invoices_with_amount_over(customer, min_sum): defevaluator(path): node =path.end ifnode.has_key('amount') andnode['amount'] > min_sum: returnEvaluation.INCLUDE_AND_CONTINUE returnEvaluation.EXCLUDE_AND_CONTINUE returndb.traversal()\ .relationships('RECIPIENT', INCOMING)\ .evaluator(evaluator)\ .traverse(customer)\ .nodes |
9.2.2. 创建数据并返回他们
把他们放在一起,我们就能创建客户和缴费单了,并且使用我们写的查询方法找到他们。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | forname in['Acme Inc.', 'Example Ltd.']: create_customer(name) # Loop through customers forrelationship incustomers.INSTANCE_OF: customer =relationship.start fori inrange(1,12): create_invoice(customer, 100*i) # Finding large invoices large_invoices =get_invoices_with_amount_over(get_customer('Acme Inc.'), 500) # Getting all invoices per customer: forrelationship inget_customer('Acme Inc.').RECIPIENT.incoming: invoice =relationship.start |