2. 对于任何人谁需要一个干净的图形运行测试套件-是一个伟大的扩展,允许通过一个REST调用清除分贝。不过,不要'它在生产!
3. 运行你的测试代码在不同的Neo4j的实例。 复制你的Neo4j的目录到一个新的位置。使用此测试。 cd到新目录中。 更改端口 CodeGo.net,使您可以运行您的测试中,它通常要更改端口开放conf/neo4j-server.properties并设置org.neo4j.server.webserver.port到的。 开始设置测试服务器。做./neo4j stop和rm -rf data/graph.db上拆卸。 欲了解更多详情,请参阅Neo4j的:如何切换数据库?和文档。
4. 在2.0.0-M6,您可以执行以下徽脚本删除所有节点和关系:start n=node(*)
match (n)-[r?]-()
delete n,r
一个快速的REST例子
首先来看些基本知识。如果没有服务API,Neo4j就不能支持其他语言。该接口提供一组基于JSON消息格式的RESTful Web服务和一个全面的发现机制。使用中使用这个接口的最快和最容易的方法是通过使用cURL:
1234567891011121314$ 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)而已。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#!/usr/bin/env python# -*- coding: utf-8 -*- from __future__ import print_function import sysfrom 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传递到这个构造器里,尽管如果什么都没有提供,代而取之的是使用默认的本地参数。也就是说下面两行是完全相等的:
123graph_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来抽象出大多数沉重的负担。这里的例子并没有解决唯一性,尽管功能上提供了唯一索引和CypherCREATE UNIQUE语句。Django开发者可能也想要考虑一个层,如Neomodel,它在Py2neo顶层上表示了一个Djangoesque ORM-style 层。
neo4j采纳java语言开发,如果我们要在java程序中以内嵌方式应用neo4j,只需导入neo4j的对应包即可。首先,我们来创建一个maven项目并改动pom.xml添加对neo4j的依附。
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 "><modelVersion>4.0.0</modelVersion><groupId>neo4j-learn</groupId><artifactId>neo4j-learn</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.neo4j</groupId><artifactId>neo4j</artifactId><version>1.9.4</version></dependency></dependencies></project>
然后,我们在项目中创建一个neo4j.properties(数据库的配置文件)文件和一个java类(调用数据库)。
neo4j.properties
# Default values for the low-level graph engine #neostore.nodestore.db.mapped_memory=25M #neostore.relationshipstore.db.mapped_memory=50M #neostore.propertystore.db.mapped_memory=90M #neostore.propertystore.db.strings.mapped_memory=130M #neostore.propertystore.db.arrays.mapped_memory=130M # Autoindexing # Enable auto-indexing for nodes, default is false #node_auto_indexing=true # The node property keys to be auto-indexed, if enabled #node_keys_indexable=name,age # Enable auto-indexing for relationships, default is false #relationship_auto_indexing=true # The relationship property keys to be auto-indexed, if enabled #relationship_keys_indexable=name,age # Keep logical logs, needed for online backups to work keep_logical_logs=true # Enable online backups to be taken from this database. online_backup_enabled=true # Uncomment and specify these lines for running Neo4j in High Availability mode. # ha.server_id is a unique integer for each instance of the Neo4j database in the cluster. # (as opposed to the coordinator instance IDs) # example: ha.server_id=1 #ha.server_id= # ha.coordinators is a comma-separated list (without spaces) of the host:port of where to # find one or more of the Neo4j coordinator servers. # Avoid localhost due to IP resolution issues on some systems. # example: ha.coordinators=localhost:2181,1.2.3.4:4321 #ha.coordinators=localhost:2181 # You can also, optionally, configure the ha.cluster_name. This is the name of the cluster this # instance is supposed to join. Accepted characters are alphabetical, numerical, dot and dash. # This configuration is useful if you have multiple Neo4j HA clusters managed by the same # Coordinator cluster. # Example: ha.cluster_name = my.neo4j.ha.cluster #ha.cluster_name = # IP and port for this instance to bind to to communicate data with the # other neo4j instances in the cluster. This is broadcasted to the other # cluster members, so different members can have different communication ports. # Optional if the members are on different machines so the IP is different for every member. #ha.server = localhost:6001 # The interval at which slaves will pull updates from the master. Comment out # the option to disable periodic pulling of updates. Unit is seconds. ha.pull_interval = 10 # The session timeout for the zookeeper client. Lower values make new master # election happen closer to the master loosing connection but also more sensitive # to zookeeper quorum hiccups. If experiencing master switches without reason # consider increasing this value. Unit is seconds #ha.zk_session_timeout = 5 # Amount of slaves the master will try to push a transaction to upon commit (default is 1). # The master will optimistically continue and not fail the transaction even if it fails to # reach the push factor. Setting this to 0 will increase write performance when writing # through master but could potentially lead to branched data (or loss of transaction) # if the master goes down. #ha.tx_push_factor=1 # Strategy the master will use when pushing data to slaves (if the push factor is greater than 0). # There are two options available "fixed" (default) or "round_robin". Fixed will start by # pushing to slaves ordered by server id (highest first) improving performance since the # slaves only have to cache up one transaction at a time. #ha.tx_push_strategy=fixed # Enable this to be able to upgrade a store from 1.4 ->1.5 or 1.4 ->1.6 #allow_store_upgrade=true # Enable this to specify a parser other than the default one. 1.5, 1.6, 1.7 are available #cypher_parser_version=1.6
java文件(neo4j示例文件改动而来)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)