neo4j cypher社区版怎么十几万条数据就卡住不动了

欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。
Neo4j社区版与企业版
社区版限制
节点:320 亿
关系:320 亿
属性:640 亿
企业版与社区版都有的功能
1、Property Graph Model
2、Native Graph Processing & Storage
4、Cypher – Graph Query Language
5、REST API
6、High-Performance Native API
企业版独有的功能
1、集群(水平伸缩/高可用)
社区版不支持集群等高可用配置,只有单机。
2、基于用户和角色的访问控制
社区版在安全管理方面相比企业版而言,功能较弱,仅提供用户和密码管理,没有涉及角色、权限控制等企业必需的安全管理功能。
社区版不支持热备份(neo4j-backup),只有企业版才有这个工具。
4、日志功能
社区版本没有日志功能,Neo4j提供安全日志和查询日志两种,用于记录数据库的查询和发生的安全事件,但仅在企业版才支持。
5、查询管理
可以设置事务超时时间,以及列出运行的查询,可以选择性终止一个或多个查询。
6、诊断及调优工具
7、管控(对属性、节点等设置规则)
8、垂直伸缩(超过4核)
10、Cypher查询追踪
11、缓存共享
12、企业级监控
13、世界级支持
套餐(服务器 x 内核) 价格(万美元/年)
3 x 8 = 19.9
3 x 4 = 9.9
2 x 4 = 6.8
1 x 4 = 3.6
如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
or分享 (0)小站会根据您的关注,为您发现更多,
看到喜欢的小站就马上关注吧!
下一站,你会遇见谁的梦想?
Neo4j&is&a&graph&database,&storing&data&in&the&nodes&and&relationships&of&a&graph.&The&most&generic&of&data&structures,&a&graph&elegantly&represents&any&kind&of&data,&preserving&the&natural&structure&of&the&domain.
Neo4j如何实现业务应用
要解决业务问题,需要把Node和domain entity对应起来,需要把Relationship和
对象之间的引用对应上,需要了解如何查询各种数据。
neo4j推荐用domain entity 包在 Node 外面。先创建一个接口,然后在实现类里
加一个underlyingNode属性。
一个普通的接口:
1. public interface Customer
3. public void setFirstName( String firstName );
4. public String getFirstName();
一个不普通的entity:&
1. import org.neo4j.graphdb.N
3. public class CustomerImpl implements Customer
5. private final Node underlyingN//这个Node与entity对应,很重要
6. private static final String KEY_FIRST_NAME = "firstName";
7. public CustomerImpl( Node underlyingNode )
9. this.underlyingNode = underlyingN
12. public void setFirstName( String firstName )
14. underlyingNode.setProperty( KEY_FIRST_NAME, firstName );
17. public String getFirstName()
19. return ( String ) underlyingNode.getProperty( KEY_FIRST_NAME
21. // ...
上面的代码看起来会有点累,但里面还没涉及到Relationship。还需要一个普通的
接口来说明问题:&
1. public interface Order
3. public void setOrderNumber( long orderNumber );
4. public long getOrderNumber();
5. public Customer getCustomer();
和另一个不普通的类:
1. import org.neo4j.graphdb.N
3. public class OrderImpl implements Order
5. private final Node underlyingN
7. public Customer getCustomer()
9. Node customerNode = underlyingNode.getSingleRelationship(
10. RelationshipTypes.CUSTOMER_TO_ORDER, Direction.INCOMING
).getStartNode();
11. return new CustomerImpl( customerNode );
是的。只有get,没有set,因为一般会在Customer里加上一个Order。先走
Customer接口:
1. public void addOrder( Order order );
再进CustomerImpl类:
1. public void addOrder( Order order )
3. underlyingNode.createRelationshipTo( orderNode,
RelationshipTypes.CUSTOMER_TO_ORDER );
好了,这样就行了,不需要在Order里面setCustomer了。&
还有个问题,Node不会自己长出来,也不能让代码里到处都是下面这种代码
1. Node node = graphDb.createNode();
2. Order order = new OrderImpl(node);
最简单的办法就是Factory
1. public class OrderFactoryImpl implements OrderFactory
3. private final GraphDatabaseService graphDb;
5. private final Node orderFactoryN
7. public OrderFactoryImpl( GraphDatabaseService graphDb )
9. this.graphDb = graphDb;
11. Relationship rel = graphDb.getReferenceNode
().getSingleRelationship(
12. MyRelationshipTypes.ORDERS, Direction.OUTGOING );
14. if ( rel == null )
16. orderFactoryNode = graphDb.createNode();
17. graphDb.getReferenceNode().createRelationshipTo(
orderFactoryNode,
18. MyRelationshipTypes.ORDERS );
23. orderFactoryNode = rel.getEndNode();
27. public Order createOrder()
29. Node node = graphDb.createNode();
30. orderFactoryNode.createRelationshipTo( node,
31. MyRelationshipTypes.ORDER );
32. return new OrderImpl( node );
上面的Factory做了些额外的工作,并没有将Order 直接 关联到reference node
上,而是引入了一个orderFactoryNode,这个节点和reference node之间的
Relationship type 是 ORDERS,所有的order节点都是用ORDER类型的
Relationship挂到他上面。neo4j将这个节点称之为subreference node,他会让图
看起来更有纪律,一个类型的节点都排在一起。
Neo4j作为服务器使用--截图
Neo4j作为服务器使用
1、Neo4j&Server&REST&API
(包含)(一致)(基础设施)
2、Creating&a&graph&through&the&REST&API&from&Java
3.2导入包和&
3.3启动服务器,运行&
package&edu.jsnu.neo4j;
import&java.net.URI;
import&java.net.URISyntaxE&
import&javax.ws.rs.core.MediaT&
import&com.sun.jersey.api.client.C
import&com.sun.jersey.api.client.ClientR
import&com.sun.jersey.api.client.WebR&
&*&@author&lujiang
public&class&CreateSimpleGraph&{
Private&static&final&String&SERVER_ROOT_URI&=&"http://localhost:7474/db/data/";&
&*&@param&args
&*&@throws&URISyntaxException
public&static&void&main(String[]&args)&throws&URISyntaxException&{
//&TODO&Auto-generated&method&stub
WebResource&resource&=&Client.create().resource(SERVER_ROOT_URI);
ClientResponse&response&=&resource.get(ClientResponse.class);&
System.out.println(String.format("GET&on&[%s],&status&code&[%d]",
SERVER_ROOT_URI,&response.getStatus()));
response.close();}&
3.5返回结果
在java项目中内嵌Neo4j数据库对应的截图
lujiang.db中的文件
整个项目的结构吧
项目目录下自动生成的lujiang.db文件夹
在java项目中内嵌Neo4j数据库
1在java项目中内嵌Neo4j数据库
1&Add&Neo4j&to&the&build&path
使用eclipse
Right-click&on&the&project&and&then&go&Build&Path&&&Configure&Build&Path.&In&the&dialog,choose&Add&External&JARs,&browse&to&the&Neo4j&lib/&directory&and&select&all&of&the&jar&files.
(右击项目-&Build&Path-&Configure&Build&Path-&Add&External&JARs-&浏览并找到neo4j-enterprise-1.5.M01/lib/所有的jar包,全选导入。)
2.1RelType&(节点之间的关系类型)
package&edu.jsnu.neo4j;
import&org.neo4j.graphdb.RelationshipT
&*&@author&lujiang
&*&使用枚举类型定义节点之间的关系类型。
public&&enum&RelTypes&implements&RelationshipType&{
package&edu.jsnu.neo4j;
import&org.neo4j.graphdb.GraphDatabaseS
import&org.neo4j.graphdb.N
import&org.neo4j.graphdb.R
import&org.neo4j.graphdb.T
import&org.neo4j.kernel.EmbeddedGraphD
&*&@author&lujiang
&*&创建两个节点(oneNode&,otherNode)和两个节点之间的关系(RelTypes.KNOWS),并输出。
public&class&Neo4j&{
public&static&void&main(String[]&args)&{
GraphDatabaseService&graphDb;
Node&otherN
Relationship&
graphDb&=&new&EmbeddedGraphDatabase("lujiang.db");
Transaction&tx&=&graphDb.beginTx();
oneNode&=&graphDb.createNode();
oneNode.setProperty("name",&"陆江");
otherNode&=&graphDb.createNode();
otherNode.setProperty("name",&"江屿");
relationship&=&oneNode.createRelationshipTo(otherNode,
RelTypes.KNOWS);
relationship.setProperty("message",&"认识");
System.out.print(&oneNode.getProperty("name"));
System.out.print(relationship.getProperty("message"));
System.out.print(&otherNode.getProperty("name"));
tx.success();
}&catch&(Exception&e)&{
tx.failure();
}&finally&{
tx.finish();
3&最终在项目目录下会自动生成一个lujiang.db的文件夹。
lujiang.db文件夹中的内容(具体这些文件是啥我也不知道)
小弟也是刚刚学习Neo4j,以上只是我自己看官方的文档学来的(没办法文档太他妈的少了),不免会有错误。如果您发现了请及时留言于我,我会及时改正。同时我十分希望喜欢新技术的志同道合的人与我一起学习讨论,共同进步。
使用Neoclipse创建的Neo4j节点(Node)及之间的关系(Relationship)
Neoclipse is a tool for visualizing and altering Neo4j databases
Java开源NoSQL数据库大全
HBaseHBase是一个分布式的、面向列的开源数据库,该技术来源于Chang et al所撰写的Google论文&Bigtable:一个结构化数据的分布式存储系统&。就像Bigtable利用了Googl文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式。HBase使用和Bigtable非常相同的数据模型。用户存储数据行在一个表里。一个数据行拥有一个可选择的键和任意数量的列。表是疏松的存储的,因此用户可以给行定义各种不同的列。HBase主要用于需要随机访问,实时读写你的大数据(Big Data)。Berkeley DB Java EditionBerkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身。 多线程支持,JE使用超时的方式来处理线程间的死琐问题。 Database都采用简单的key/value对应的形式。 事务支持。 允许创建二级库。这样我们就可以方便的使用一级key,二级key来访问我们的数据。 支持RAM缓冲,这样就能减少频繁的IO操作。 支持日志。 数据备份和恢复。 游标支持。
Neo4j是一个嵌入式,基于磁盘的,支持完整事务的Java持久化引擎,它在图像中而不是表中存储数据。Neo4j提供了大规模可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图像,可以扩展到多台机器并行运行。相对于关系数据库来说,图形数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询&&在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。Neo4j重点解决了拥有大量连接的传统RDBMS在查询时出现的性能衰退问题。通过围绕图形进行数据建模,Neo4j会以相同的速度遍历节点与边,其遍历速度与构成图形的数据量没有任何关系。此外,Neo4j还提供了非常快的图形算法、推荐系统和OLAP风格的分析,而这一切在目前的RDBMS系统中都是无法实现的。Neo是一个网络&&面向网络的数据库&&也就是说,它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络上而不是表中。网络(从数学角度叫做图)是一个灵活的数据结构,可以应用更加敏捷和快速的开发模式。你可以把Neo看作是一个高性能的图引擎,该引擎具有成熟和健壮的数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中&&但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。由于使用了&面向网络的数据库&,人们对Neo充满了好奇。在该模型中,以&节点空间&来表达领域数据&&相对于传统的模型表、行和列来说,节点空间是很多节点、关系和属性(键值对)构成的网络。关系是第一级对象,可以由属性来注解,而属性则表明了节点交互的上下文。网络模型完美的匹配了本质上就是继承关系的问题域,例如语义Web应用。Neo的创建者发现继承和结构化数据并不适合传统的关系数据库模型:
对象关系的不匹配使得把面向对象的&圆的对象&挤到面向关系的&方的表&中是那么的困难和费劲,而这一切是可以避免的。
关系模型静态、刚性、不灵活的本质使得改变schemas以满足不断变化的业务需求是非常困难的。由于同样的原因,当开发小组想应用敏捷软件开发时,数据库经常拖后腿。
关系模型很不适合表达半结构化的数据&&而业界的分析家和研究者都认为半结构化数据是信息管理中的下一个重头戏。
网络是一种非常高效的数据存储结构。人脑是一个巨大的网络,万维网也同样构造成网状,这些都不是巧合。关系模型可以表达面向网络的数据,但是在遍历网络并抽取信息的能力上关系模型是非常弱的。虽然Neo是一个比较新的开源项目,但它已经在具有1亿多个节点、关系和属性的产品中得到了应用,并且能满足企业的健壮性和性能的需求:完全支持JTA和JTS、2PC分布式ACID事务、可配置的隔离级别和大规模、可测试的事务恢复。这些不仅仅是口头上的承诺:Neo已经应用在高请求的24/7环境下超过3年了。它是成熟、健壮的,完全达到了部署的门槛。
NeoDatis ODB是一个面向对象数据库,一个真正透明的对象持久层。利用一行简单的代码就能够持久化native object。ODB非常简单、非常快并自带强大查询语言。ODB既可以做为一个内嵌数据库引擎使用,也可以以C/S模式运行。Apache Apache Cassandra是一套开源分布式 Key-Value 存储系统。它最初由 Facebook 开发,用于储存特别大的数据。 Cassandra 不是一个数据库,它是一个混合型的非关系的数据库,类似于 Google 的 BigTable。本文主要从以下五个方面来介绍 Cassandra:Cassandra 的数据模型、安装和配制 Cassandra、常用编程语言使用 Cassandra 来存储数据、Cassandra 集群搭建。Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。)Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Google&s BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前,需要先记录日志 ( CommitLog ),然后数据开始写入到 Column Family 对应的 Memtable 中,Memtable 是一种按照 key 排序数据的内存结构,在满足一定条件时,再把 Memtable 的数据批量的刷新到磁盘上,存储为 SSTable 。
Voldemort是一个分布式键-值(Key-value)存储系统,是Amazon&s Dynamo的一个开源克隆。
支持自动复制数据到多个服务器上。
支持数据自动分割所以每个服务器只包含总数据的一个子集。
提供服务器故障透明处理功能。
支持可拨插的序化支持,以实现复杂的键-值存储,它能够很好的5.集成常用的序化框架如:Protocol Buffers、Thrift、Avro和Java Serialization。
数据项都被标识版本能够在发生故障时尽量保持数据的完整性而不会影响系统的可用性。
每个节点相互独立,互不影响。
支持可插拔的数据放置策略。
Perst 是一个面向对象的开源嵌入式数据库软件, 能够有效的处理移动设备上的大量数据。Perst 是McObject 公司发布的一款非常袖珍的开源嵌入式数据库, 是一个简单, 快速, 便捷, 面向对象, 适合 与.NET 的数据库。Perst 不需要专门的编译器与预处理器, 支持ACID 事务。对于在资源受限的移动设备( 如手机, PDA 等)上存储大量数据和对数据进行频繁的IO 操作往往要消耗很多的设备资源。由于移动设备内存小, 性能较差, 如果采用关系数据库( 如SQLServer2000, Oracle) 管理数据, 仅靠其有限的内存资源是不能运行这些数据库管理系统的, 这样就有必要采用一些特殊的数据库系统。Perst 数据库正是为这类设备研究开发的, 它们的作用是在资源受限的设备上完成大量数据的访问操作。其实这些设备系统资源主要消耗在从磁盘上读取数据的IO 操作。如何提供一种有效的文件存储策略来降低对磁盘的IO 操作是嵌入式数据库软件设计的主要任务。像其他嵌入式数据库一样,Perst没有管理上的代价,但不同的是Perst直接将对象以Java或者C#对象的形式进行存储。因此不需要在对象的内部表现形式和Java/C#表现形式之间转换。这个数据库引擎非常精悍,只有约5000行代码,McObject对此感到骄傲。根据访问模式不同,运行时需要30K到300K的内存。
Terrastore是一个基于Terracotta(一个业界公认的、快速的分布式集群组件)实现的高性能分布式文档数据库。可以动态从运行中的集群添加/删除节点,而且不需要停机和修改任何配置。支持通过http协议访问Terrastore。Terrastore提供了一个基于集合的键/值接口来管理JSON文档并且不需要预先定义JSON文档的架构。易于操作,安装一个完整能够运行的集群只需几行命令。
HyperGraphDB是一个通用,可扩展,可移植的,分布式,可嵌入的开源数据存储机制。专为人工智能和语义Web项目而设计。它也可以用来作为一个适用于各种规模项目的嵌入式面向对象数据库。HyperGraphDB是一个基于Java的产品,构建在Berkeley DB存储类库之上。它的主要特性包括:
支持广义图存储。开放,可扩展的类型系统。
基本查询系统和图形的遍历算法。
支持Java对象直接存储。
线程安全的事务处理。
提供P2P框架实现数据分发。
OrientDB是兼具文挡数据库的灵活性和图形数据库管理链接能力的可深层次扩展的文档-图形数据库管理系统。可选无模式、全模式或混合模式下。支持许多高级特性,诸如ACID事务、快速索引,原生和SQL查询功能。可以JSON格式导入、导出文档。若不执行昂贵的JOIN操作的话,如同关系数据库可在几毫秒内可检索数以百记的链接文档图。HandlerSocket client for javaHandlerSocket是一个MySql插件,可以将mysql作为NoSQL来使用。通过这个插件,你可以直接跟MySql后端的存储引擎做key-value式的交互,省去了MySql上层的SQL解释、打开关闭表、创建查询计划等CPU消耗型的开销。hs4j是HandlerSocket的一个java客户端。HS4J的使用很简单,所有的操作都通过HSClient这个接口进行。HS4J同样支持连接池,可以在构建客户端的时候传入连接池大小。相关文章:
: 淘宝的key/value解决方案Tair是一个分布式的key/value结构数据的解决方案,系统默认支持基于内存和文件的存储引擎,对应于通常我们所说的缓存和持久化存储。Tair具有良好的架构,使得其在可扩展性、数据安全性方面都有较好的表现:
基于对照表的灵活、良好的可扩展性
轻量级的configserver
抽象的存储引擎层,支持添加新的存储引擎
自动的复制和迁移,对用户透明
多机架和多数据中心的支持
插件容器Tair除了基本的key/value操作外,还提供了一些实用的功能,使得其适用的场景更多:
数据的version支持
原子计数器支持
item支持相关文章:
LucidDB是唯一一款专注于数据仓库和商务智能的开源RDBMS,它使用了列存储架构,支持位图索引,哈希连接/聚合和页面级多版本,大部分数据库最初都注重事务处理能力,而分析功能都是后来才加上去的。相反,LucidDB中的所有组件从一开始就是为满足灵活的需求,高性能数据集成和大规模数据查询而设计的,此外,其架构设计彻底从用户出发,操作简单,完全无需DBA。LucidDB对硬件要求也极低,即使不搭建集群环境,在单一的Linux或Windows服务器上也能获得极好的性能。最新版本还加入了对Mac OS X和Windows 64位的支持,官方网站上的文档和教程也非常丰富,非常值得你体验一下。
Couchdb4jCouchdb4j是一个Java开源类库用于与基于JSON的CouchDB数据库交互。
Neo4j 官方主页
Neo4j 之 Property
Neo4j 之 Relationship
Neo4j 之 Node
Neo4j是一个嵌入式,基于磁盘的,支持完整事务的Java持久化引擎,它在图像中而不是表中存储数据。Neo4j提供了大规模可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图像,可以扩展到多台机器并行运行。相对于关系数据库来说,图形数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询&&在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。Neo4j重点解决了拥有大量连接的传统RDBMS在查询时出现的性能衰退问题。通过围绕图形进行数据建模,Neo4j会以相同的速度遍历节点与边,其遍历速度与构成图形的数据量没有任何关系。此外,Neo4j还提供了非常快的图形算法、推荐系统和OLAP风格的分析,而这一切在目前的RDBMS系统中都是无法实现的。&  Neo是一个网络&&面向网络的数据库&&也就是说,它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络上而不是表中。网络(从数学角度叫做图)是一个灵活的数据结构,可以应用更加敏捷和快速的开发模式。&  你可以把Neo看作是一个高性能的图引擎,该引擎具有成熟和健壮的数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中&&但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。&  由于使用了&面向网络的数据库&,人们对Neo充满了好奇。在该模型中,以&节点空间&来表达领域数据&&相对于传统的模型表、行和列来说,节点空间是很多节点、关系和属性(键值对)构成的网络。关系是第一级对象,可以由属性来注解,而属性则表明了节点交互的上下文。网络模型完美的匹配了本质上就是继承关系的问题域,例如语义Web应用。Neo的创建者发现继承和结构化数据并不适合传统的关系数据库模型:&  1.对象关系的不匹配使得把面向对象的&圆的对象&挤到面向关系的&方的表&中是那么的困难和费劲,而这一切是可以避免的。&  2.关系模型静态、刚性、不灵活的本质使得改变schemas以满足不断变化的业务需求是非常困难的。由于同样的原因,当开发小组想应用敏捷软件开发时,数据库经常拖后腿。&  3.关系模型很不适合表达半结构化的数据&&而业界的分析家和研究者都认为半结构化数据是信息管理中的下一个重头戏。&  4.网络是一种非常高效的数据存储结构。人脑是一个巨大的网络,万维网也同样构造成网状,这些都不是巧合。关系模型可以表达面向网络的数据,但是在遍历网络并抽取信息的能力上关系模型是非常弱的。&  虽然Neo是一个比较新的开源项目,但它已经在具有1亿多个节点、关系和属性的产品中得到了应用,并且能满足企业的健壮性和性能的需求:&  完全支持JTA和JTS、2PC分布式ACID事务、可配置的隔离级别和大规模、可测试的事务恢复。这些不仅仅是口头上的承诺:Neo已经应用在高请求的24/7环境下超过3年了。它是成熟、健壮的,完全达到了部署的门槛。
站长在关注聊聊Neo4j图数据库的那些明显优势聊聊Neo4j图数据库的那些明显优势闲聊君百家号引言:Neo4j是一个NoSQL的图数据库管理系统,像其他NoSQL数据库一样具有高效的查询性能。同时,Neo4j还具有完全事务管理特性,完全支持ACID事务管理。Neo4j与其他数据库相比,具有哪些明显的优势呢?本文选自《Neo4j全栈开发》。在高速发展的互联网应用中,业务需求的频繁变更和数据的快速增长都要求数据库必须具有很强的适应能力。Neo4j图数据库正是一个能够适应这种业务需求不断变化和大规模数据增长而产生的数据库,它不但具有很强的适应能力,而且能够自始至终保持高效的查询性能。现实世界中的一切事物都处在联系之中,如人际关系、电脑网络、地理数据、分子结构模型等,无一不处在纷繁复杂的联系之中。这种联系形成了一种互相关联的数据,联系才是数据的本质所在。传统的关系型数据库并不能很好地表现数据的联系,而一些NoSQL(Not Only SQL,非关系型数据库)数据库又不能表现数据之间的联系。同样是NoSQL的Neo4j图数据库是以图的结构形式来存储数据的,它所存储的就是联系的数据,是关联数据本身。关联数据中的联系本来就很复杂,若要在关系型数据库中使用结构化形式来表现这种联系,则一般不能直接表示,处理起来既烦琐又费事,并且随着数据的不断增长,其访问性能将日趋下降。无数的开发人员和数据库管理人员都或多或少地使用过关系型数据库,在其应用的规模化进展过程中,对于数据库的性能优化往往捉襟见肘、陷入窘境。Neo4j没有模式结构的定义,也不需要这些定义,它使用非结构化的方式来存储关联数据,所以能够直接表现数据的关联特性。Neo4j不管是与关系型数据库相比,还是与其他NoSQL数据库相比,都具有很多前所未有的优势,这可以从以下几个方面来分析,主要表现为查询的高性能、设计的灵活性和开发的敏捷性等。1 高性能表现Neo4j是一个原生的图数据库引擎,它存储了原生的图数据,因此,可以使用图结构的自然伸展特性来设计免索引邻近节点遍历的查询算法,即图的遍历算法设计。图的遍历是图数据结构所具有的独特算法,即从一个节点开始,根据其连接的关系,可以快速和方便地找出它的邻近节点。这种查找数据的方法并不受数据量的大小所影响,因为邻近查询始终查找的是有限的局部数据,不会对整个数据库进行搜索。所以,Neo4j具有非常高效的查询性能,相比于RDBMS可以提高数倍乃至数十倍的查询速度。而且查询速度不会因数据量的增长而下降,即数据库可以经久耐用,并且始终保持最初的活力。不像RDBMS那样,因为不可避免地使用了一些范式设计,所以在查询时如果需要表示一些复杂的关系,势必会构造很多连接,从而形成很多复杂的运算。并且在查询中更加可怕的是还会涉及大量数据,这些数据大多数与结果毫无关系,有的可能仅仅是通过ID查找它的名称而已,所以随着数据量的增长,即使查询一小部分数据,查询也会变得越来越慢,性能日趋下降,以至于让人无法忍受。2 设计的灵活性在日新月异的互联网应用中,业务需求会随着时间和条件的改变而发生变化,这对于以往使用结构化数据的系统来说,往往很难适应这种变化的需要。图数据结构的自然伸展特性及其非结构化的数据格式,让Neo4j的数据库设计可以具有很大的伸缩性和灵活性。因为随着需求的变化而增加的节点、关系及其属性并不会影响到原来数据的正常使用,所以使用Neo4j来设计数据库,可以更接近业务需求的变化,可以更快地赶上需求发展变化的脚步。大多数使用关系型数据库的系统,为了应对快速变化的业务需求,往往需要采取推倒重来的方法重构整个应用系统。而这样做的成本是巨大的。使用Neo4j可以最大限度地避免这种情况发生。虽然有时候,也许是因为最初的设计考虑得太不周全,或者为了获得更好的表现力,数据库变更和迁移在所难免,但是使用Neo4j来做这项工作也是非常容易的,至少它没有模式结构定义方面的苦恼。3 开发的敏捷性图数据库设计中直观明了的数据模型,从需求的讨论开始,到程序开发和实现,以及最终保存在数据库中的样子,它的模样似乎没有什么变化,甚至可以说本来就是一模一样的。这说明,业务需求与系统设计之间可以拉近距离,需求和实现结果之间越来越接近。这不但降低了业务人员与设计人员之间的沟通成本,也使得开发更加容易迭代,并且非常适合使用敏捷开发方法。Neo4j本身可伸缩的设计灵活性,以及直观明了的数据模型设计,还有其自身简单易用的特点等,所有这些优势充分说明,使用Neo4j很适合以一种测试驱动的方法应用于系统设计和开发自始至终的过程之中,通过迭代来加深对需求的理解,并通过迭代来完善数据模型设计。4 与其他数据库的比较与当前一些主流的数据库相比,不管是传统的关系型数据库,还是NoSQL数据库,或者同类的图数据库,Neo4j都是出类拔萃的。在传统的RDBMS中,如果要表现一个部门的用户,即1.2节提到的例子,按照第三范式的设计要求,至少需要三张表格来表示,即部门表、用户表和部门-用户关系表,这样实体和关系就被人为地隔开了,它们是完全分离的,存在于不同的表中,这就给查询带来了一定的难度,从而影响了查询的性能。而Neo4j所表现的是实体的联系本身,它表现了现实世界中事物联系的本质,它的联系在节点创建时就已经建立,所以在查询中能以快捷的路径返回关联数据,从而表现出非常高效的查询性能。Key-Value的数据库虽然能提供高性能的查询,但它所能表示的内容是有限的。实际上,Neo4j节点的属性就是一些Key-Value的数据集合。而Neo4j通过节点和关系的属性可以表现更为丰富多彩的内容,这是其他Key-Value的数据库所无法比拟的。对于Key-Document文档数据库来说,相对于Key-Value数据库,内容是丰富了些,但美中不足的是,一个文档经不起内容的变更或修改。如果用Neo4j的节点及其属性来表示,则处理这种类似的变更却是轻而易举的。在图数据库领域,除Neo4j之外,还有其他如OrientDB、Giraph、AllegroGraph等各种图数据库。跟所有这些图数据库相比,Neo4j的优势表现在以下两个方面。(1)Neo4j是一个原生图计算引擎,它存储和使用的数据自始至终都是使用原生的图结构数据进行处理的,不像有些图数据库,只是在计算处理时使用了图结构数据,而在存储时还将数据保存在关系型数据库中。(2)Neo4j是一个开源的数据库,其开源的社区版吸引了众多第三方的使用和推广,如开源项目Spring Data Neo4j就是一个做得很不错的例子,同时也得到了更多开发者的拥趸和支持,聚集了丰富的可供交流和学习的资源与案例。这些支持、推广和大量的使用,反过来会很好地推动Neo4j的发展。5 综合表现Neo4j查询的高性能表现、易于使用的特性及其设计的灵活性和开发的敏捷性,以及坚如磐石般的事务管理特性等特点,都充分说明了使用Neo4j是一个不错的选择。有关它的所有优点,总结起来,主要表现在以下几个方面。(1)闪电般的读/写速度,无与伦比的高性能表现。(2)非结构化数据存储方式,在数据库设计上具有很大的灵活性。(3)能很好地适应需求变化,并适合使用敏捷开发方法。(4)很容易使用,可以用嵌入式、服务器模式、分布式模式等方式来使用数据库。(5)使用简单框图就可以设计数据模型,方便建模。(6)图数据的结构特点可以提供更多更优秀的算法设计。(7)完全支持ACID完整的事务管理特性。(8)提供分布式高可用模式,可以支持大规模的数据增长。(9)数据库安全可靠,可以实时备份数据,很方便恢复数据。(10)图的数据结构直观而形象地表现了现实世界的应用场景。本文选自《Neo4j全栈开发》。本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。闲聊君百家号最近更新:简介:致力于娱乐、幽默,将给您带来无限快乐。作者最新文章相关文章

我要回帖

更多关于 neo4j 安装 的文章

 

随机推荐