Neo4j一个高性能的NoSQL图形数据库

对于这样的应用,使用 Neo4j 来">存储数据会非常的自然,要优于使用关系数据库。本文对 Neo4j 进行了深入的介绍,并结合具体的实例来进行详细的说明,可以让您对 Neo4j 有深入的了解,从而可以在应用开发中恰当地选择 Neo4j 来作为存储方式。

数据存储一般是应用开发中不可或缺的组成部分。应用运行中产生的和所需要的数据被以特定的格式持久化下来。应用开发中很常见的一项任务是在应用本身的领域对象模型与数据存储格式之间进行相互转换。如果数据存储格式与领域对象模型之间比较相似,那么进行转换所需的映射关系更加自然,实现起来也更加容易。对于一个特定的应用来说,其领域对象模型由应用本身的特征来决定,一般采用最自然和最直观的方式来进行建模。所以恰当的选择数据存储格式就显得很重要。目前最常见的数据存储格式是关系数据库。关系数据库通过实体 - 关系模型(E-R 模型)来进行建模,即以表和表之间的关系来建模。在实际开发中可以使用的关系数据库的实现非常多,包括开源的和商用的。关系数据库适合用来存储数据条目的类型同构的表格型数据。如果领域对象模型中不同对象之间的关系比较复杂,则需要使用繁琐的对象关系映射技术(Object-Relationship Mapping,ORM)来进行转换。

对于很多应用来说,其领域对象模型并不适合于转换成关系数据库形式来存储。这也是非关系型数据库(NoSQL)得以流行的原因。NoSQL 数据库的种类很多,包括键值对数据库、面向文档数据库和图形数据库等。本文中介绍的 Neo4j 是最重要的图形数据库。Neo4j 使用数据结构中图(graph)的概念来进行建模。Neo4j 中两个最基本的概念是节点和边。节点表示实体,边则表示实体之间的关系。节点和边都可以有自己的属性。不同实体通过各种不同的关系关联起来,形成复杂的对象图。Neo4j 同时提供了在对象图上进行查找和遍历的功能。

对于很多应用来说,其中的领域对象模型本身就是一个图结构。对于这样的应用,使用 Neo4j 这样的图形数据库进行存储是最适合的,因为在进行模型转换时的代价最小。以基于社交网络的应用为例,用户作为应用中的实体,通过不同的关系关联在一起,如亲人关系、朋友关系和同事关系等。不同的关系有不同的属性。比如同事关系所包含的属性包括所在公司的名称、开始的时间和结束的时间等。对于这样的应用,使用 Neo4j 来进行数据存储的话,不仅实现起来简单,后期的维护成本也比较低。

Neo4j 使用“图”这种最通用的数据结构来对数据进行建模使得 Neo4j 的数据模型在表达能力上非常强。链表、树和散列表等数据结构都可以抽象成用图来表示。Neo4j 同时具有一般数据库的基本特性,包括事务支持、高可用性和高性能等。Neo4j 已经在很多生产环境中得到了应用。流行的云应用开发平台 Heroku 也提供了 Neo4j 作为可选的扩展。

在简要介绍完 Neo4j 之后,下面介绍 Neo4j 的基本用法。

Neo4j 基本使用

在使用 Neo4j 之前,需要首先了解 Neo4j 中的基本概念。

节点和关系

Neo4j 中最基本的概念是节点(node)和关系(relationship)。节点表示实体,由 org.neo4j.graphdb.Node 接口来表示。在两个节点之间,可以有不同的关系。关系由 org.neo4j.graphdb.Relationship 接口来表示。每个关系由起始节点、终止节点和类型等三个要素组成。起始节点和终止节点的存在,说明了关系是有方向,类似于有向图中的边。不过在某些情况,关系的方向可能并没有意义,会在处理时被忽略。所有的关系都是有类型的,用来区分节点之间意义不同的关系。在创建关系时,需要指定其类型。关系的类型由 org.neo4j.graphdb.RelationshipType 接口来表示。节点和关系都可以有自己的属性。每个属性是一个简单的名值对。属性的名称是 String 类型的,而属性的值则只能是基本类型、String 类型以及基本类型和 String 类型的数组。一个节点或关系可以包含任意多个属性。对属性进行操作的方法声明在接口 org.neo4j.graphdb.PropertyContainer 中。Node 和 Relationship 接口都继承自 PropertyContainer 接口。PropertyContainer 接口中常用的方法包括获取和设置属性值的 getProperty 和 setProperty。下面通过具体的示例来说明节点和关系的使用。

该示例是一个简单的歌曲信息管理程序,用来记录歌手、歌曲和专辑等相关信息。在这个程序中,实体包括歌手、歌曲和专辑,关系则包括歌手与专辑之间的发布关系,以及专辑与歌曲之间的包含关系。清单 1 给出了使用 Neo4j 对程序中的实体和关系进行操作的示例。

清单 1. 节点和关系的使用示例

private static enum RelationshipTypes implements RelationshipType { PUBLISH, CONTAIN } public void useNodeAndRelationship() { GraphDatabaseService db = new EmbeddedGraphDatabase("music"); Transaction tx = db.beginTx(); try { Node node1 = db.createNode(); node1.setProperty("name", "歌手 1"); Node node2 = db.createNode(); node2.setProperty("name", "专辑 1"); node1.createRelationshipTo(node2, RelationshipTypes.PUBLISH); Node node3 = db.createNode(); node3.setProperty("name", "歌曲 1"); node2.createRelationshipTo(node3, RelationshipTypes.CONTAIN); tx.success(); } finally { tx.finish(); } }

在 清单 1 中,首先定义了两种关系类型。定义关系类型的一般做法是创建一个实现了 RelationshipType 接口的枚举类型。RelationshipTypes 中的 PUBLISH 和 CONTAIN 分别表示发布和包含关系。在 Java 程序中可以通过嵌入的方式来启动 Neo4j 数据库,只需要创建 org.neo4j.kernel.EmbeddedGraphDatabase 类的对象,并指定数据库文件的存储目录即可。在使用 Neo4j 数据库时,进行修改的操作一般需要包含在一个事务中来进行处理。通过 GraphDatabaseService 接口的 createNode 方法可以创建新的节点。Node 接口的 createRelationshipTo 方法可以在当前节点和另外一个节点之间创建关系。

另外一个与节点和关系相关的概念是路径。路径有一个起始节点,接着的是若干个成对的关系和节点对象。路径是在对象图上进行查询或遍历的结果。Neo4j 中使用 org.neo4j.graphdb.Path 接口来表示路径。Path 接口提供了对其中包含的节点和关系进行处理的一些操作,包括 startNode 和 endNode 方法来获取起始和结束节点,以及 nodes 和 relationships 方法来获取遍历所有节点和关系的 Iterable 接口的实现。关于图上的查询和遍历,在下面小节中会进行具体的介绍。

时间: 2024-09-20 09:27:07

Neo4j一个高性能的NoSQL图形数据库的相关文章

一个高性能、轻量级的分布式内存队列系统--beanstalk

Beanstalk是一个高性能.轻量级的.分布式的.内存型的消息队列系统.最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟.其实Beanstalkd是典型的类Memcached设计,协议和使用方式都是同样的风格.其基本设计思想很简单:高性能离不开异步,异步离不开队列,而内部都是生产者-消费者模式的. 背景介绍: 现在市面上有很多消息队列系统了.常用的有ActiveMQ, RabbitMQ,ZeroMA,Kafka,RocketMQ.Redis之父最近又开源了一

Tair是一个高性能,分布式,可扩展,高可靠的key/value结构存储系统(转)

Tair是一个高性能,分布式,可扩展,高可靠的key/value结构存储系统! Tair专为小文件优化,并提供简单易用的接口(类似Map)Tair支持Java和C版本的客户端   Tair is a distributed key-value storage system originally developed at Taobao.com. features: simple client configuration thanks to lightweight config server ite

如何设计一个高性能的日志系统

问题描述 如何设计一个高性能的日志系统 需求: 1.系统采用B/S架构,要求能够记录客户端的任何事件,比如单击了某个按钮或者链接: 2.要求能够记录用户每次操作时后台代码使用到的SQL和参数,比如添加数据时的SQL语句和具体的Parameter: 3.将1和2串联或者合并起来,意思就是我在分析日志时,能够在查询客户端事件时也能看到后台的SQL语句和参数: 4.2年内数据达到20亿条记录,采用什么样的数据库比较合适,非关系行的MongoDB还是关系型的Oracle: 解决方案 4.什么数据库都没关

Yii一个高性能的、基于组件的PHP框架

本文将通过具体的实例对 Yii 框架进行阐述,使读者在真实的案例中去学习如何使用 Yii 框架创建自己的 Web 应用,从而对这个优秀的 PHP 框架有个更真实的体验. Yii 是什么? Yii 是一个高性能的.基于组件的 PHP 框架,用于 Web 应用程序的快速开发. Yii 的名字来源于"Yes It Is"的字母缩写.这句话肯定地回答了众多关于这个框架的疑问:"它是否快速?是否安全?是否强大?是否适合我们的项目?" Yii 适合做什么? Yii 是一个通用的

构建一个高性能的网页抓取器,互联网营销

  互联网的发展,使人类提前进入了信息爆炸的年代,在浩瀚无边的信息海洋里,如何快速.准确找到对自己有用的信息,就成了一个很有价值的研究课题,于是,搜索引擎应运而生.现在,国内外大大小小的搜索引擎有很多,搜搜也是这搜索引擎大军中的一员悍将.笔者有幸参与了搜搜研发过程中的一些工作,在这里写一些自己的理解与看法,权当是抛砖引玉,希望能够得到业内前辈们的一些指点. 对于网页搜索引擎来说,它的基本处理流程,通常可以分为三个步骤:一是对海量互联网网页的抓取,也称下载:二是对已下载的网页进行预处理,包括抽取正

【云计算的1024种玩法】手把手教你如何编译一个高性能 OpenResty

介绍 本教程将介绍如何一步一步手动编译 OpenResty,OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,拥有非常好的拓展性让服务器发挥更好性能.教程中将全部依赖 Linux 发行版组建中的依赖,而免除编译带来的后期维护成本. OpenResty 的额外拓展: OpenSSL 1.1.0,提供 ALPN 支持,支持 HTTP/2 Nginx-CT,透明证书提高 HTTPS 网站的安全性和浏览器支持 ngx_PageSpeed,Google 家的网站性能优化工具

Multi Libvent TCP Server:一个高性能的TCP服务器

MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩.同时他可以是一个很简洁的Linux C 开发学习工程.毫不夸张的说,如果全部掌握这一个工程,你会成为一个Linux C的牛人:当然,你也可以通过源码包的mario.c(maritcp服务器示例程序)来学习,可以很快入门上手进行Linux C开发. 经过两个多月的测试(编写c++客户端测试及调优系统参数),测试结果得到单机最大带宽吞吐1000M,测试最高TCP长连接100万,每秒处理连接数达4万,此时系统压力load值很低.总之

LMAX Disruptor——一个高性能、低延迟且简单的框架

原文地址:LMAX Disruptor – High Performance, Low Latency and Simple Too 翻译:杨帆 校对:丁一 Disruptor是一个用于在线程间通信的高效低延时的消息组件,它像个增强的队列,并且它是让LMAX Exchange跑的如此之快的一个关键创新.关于什么是Disruptor.为何它很重要以及它的工作原理方面的信息都呈爆炸性增长 -- 这些文章很适合开始学习Disruptor,还可跟着LMAX BLOG深入学习.这里还有一份更详细的白皮书.

Hypertable 0.9.5.6发布 一个高性能和可扩展的数据库

Hypertable 是一款仿照Google Bigtable的高性能和可扩展的数据库.其目的是管理商用服务器的大型集群存储和http://www.aliyun.com/zixun/aggregation/7394.html">信息处理,提供回弹到机器和组件故障. Hypertable 是由Zvents设计的BigTable clone开放原始码专案,以 C++++撰写,可架在 HDFS 和 KFS 上.尽管还在初期阶段,但已有不错的效能:写入 28M 列的资料,各节点写入速率可达7MB/