草庐IT

Neo4j - Neo4j概述

ゞ浪人与酒丶0 2023-10-14 原文

Neo4j - Neo4j概述

Neo4j是由 Java 实现的开源 NoSQL 图数据库。Neo4j实现了专业数据库级别的图数据模型的存储。与普通的图处理或内存数据库不同,Neo4j 提供了完整的数据库特性,包括 ACID 事务的支持、集群支持、备份与故障转移等,这使其适合于企业级生产环境下各种应用。

Neo4j 还提供了一些特殊的功能

  • 一个本地化的图数据库:Neo4j 自底向上构建成一个图数据库。它的体系结构旨在优化快速管理、存储和遍历节点和关系。在 Neo4j 中,关系是数据库中最重要的元素,它代表节点之间的相互联系。众所周知,在关系数据库领域中,"关系"适用于多个不同表之间的连接操作,这种操作的性能下降与关系的数量呈指数级别的,但在 Neo4j 中则是用于从一个几点指向另一个节点,其性能却是线性级别的
  • 界面友好:提供了查询与展示的 Web 操作界面。对于图数据模型使用 D3.js 做数据可视化,形象地展示了数据模型的节点和关系
  • 声明式图查询语言:Cypher 是一种声明式图数据库查询语言,它表现力丰富,查询效率高,其地位和作用域关系型数据库中的 SQL 类似,Cypher 还有良好的扩展性,用户可以定制自己的查询方式(如自定义过程)
  • ACID事务:Neo4j 通过 ACID 事务提供真正的数据安全, Neo4j 使用事务来保证输在硬件故障或系统奔溃的情况下不会丢失。
  • 高性能:Neo4j 使用多副本主从复制的方式构建高可靠集群,支持大数据集合并且可以不断扩展其容量,可存储数百万亿个实体,提供了可容错、可扩展的集群,此外Neo4j还提供热备份和性能监控功能
  • 代码开源:Neo4j 将源码公布到GitHub

体系结构

揭开 Neo4j 所采用什么样的体系结构

Neo4j 最初的设计动机是为了更好地描述实体之间的联系。现实生活中,每个实体都与周围的其他实体有千丝万缕的关系,这些关系里存在着大量的潜在信息。但是传统的关系型数据库更加注重刻画实体内部属性,实体与实体之间关系通过外键来实现,因此需要大量的 join 操作,而 join 操作通常又非常耗时。随着现实世界中关系的急剧增加,导致关系型数据库已经逐渐地难以承载查询海量数据深层次关系需要大量数据库操作带来复杂性,Neo4j 在这种情况应运而生

免索引邻接

Neo4j 有一个重要的特点,就是用来保证关系查询的速度,既免索引邻接,数据库中每个节点都会维护与它相邻节点的引用。因此每个节点都相当于与它相邻节点的微索引,这比使用全局索引的代价要小很多。这就意味着查询时间和图的整体规模无关,只与它附近节点的数量成正比。在关系型数据库中使用全局索引连接各个节点,这些索引每个遍历都会增加一个中间层,因此会导致非常大的计算成本。而免索引邻接为图数据库提供了快速高效的图遍历能力

对比图

  • RDBMS关系查询示意图

  • Neo4j关系查询示意图

RDBMS 关系图要查找 Alice 所购买的东西,首先要执行关系表索引查询,时间成本 O(log(n)),n 为索引表的长度。这对于偶尔的浅层次查询是可以接受的,但是当查询的层次变深或者是执行反向查询时代码将变得不可接受。

Neo4j关系图使用了免索引近邻机制,每个节点都有直接或简介指向其相邻节点的指针。要查找 Alice 买过的东西,只需要在Alice 的关系链表中遍历,每次遍历成本为 O(1)

免索引邻接针对 RDBMS 中关系查询两个缺点做了改进

  • 免索引邻接使用遍历物理关系的方法查找,比起全局索引来说代价要小得多。查询一个索引一般的时间复杂度为 O(log(n)),而遍历物理关系的时间复杂度为 O(1),至少对于Neo4j的存储结构来说是如此
  • 当索引建立之后在试图反向遍历时,建立的索引就起不到作用了。我们两个选择:对每个反向遍历的场景创建反向查找索引,或者使用原索引进行暴力搜索,而暴力搜索的时间复杂度为O(n)。这种代价相对于很多需要实时操作的场景来说不可接受的

利用免索引邻接机制,在图数据库上进行关系查找效率非常高,这种高效是建立在图数据库注重关系的架构设计之上的。

基本元素与概念

节点

节点(Node)是图数据库中的一个基本元素,用以表示一个实体记录,就像关系数据库中的一条记录一样。在 Neo4j 中节点可以包含多个属性(Property)和多个标签(Label)

这是一个最简单的节点,它只有一个属性,属性名是 name , 属性值是 Tom

关系

关系(Relationship)同样是图数据库中的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也成为图论的边(Edge), 其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,单关系只能有一个类型(Type)

一个节点可以被多个关系指向或作为关系的起始关系

多个关系指向同一个节点

关系必须有开始节点(Start node) 和结束节点(End node),两头都不能为空

由于关系是有方向的,所以可在由几点、关系组成的图中进行遍历

属性

上面提到节点和关系都可以有多个属性。属性是有键值对组成的,就像 Java 的哈希表咿呀,属性名类似变量名,属性值类似变量值。属性值可以是基本的数据类型,或者由基本数据类型组成的数组

路径

当是有节点和关系创建一个图后,在此图中任意两个几点间都是可能存在路径的

任意两节点都存在由节点和关系组成的路径,路径也有长度的概念,也就是路径中关系的条数,当然也可以说单独一个节点就可以组成长度为0的路径

遍历

遍历一张图就是按照一定规则,根据它们之间的关系,依次访问是有相关联的节点的操作。

对于遍历操作不必自己实现,因为 Neo4j 提供了一套高效的遍历 API ,可以指定遍历规则,然后让 Neo4j 自动按照遍历规则遍历并返回遍历的结果。遍历规则可以是广度优先,也可以是深度优先

有关Neo4j - Neo4j概述的更多相关文章

  1. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  2. ruby - 是否有 Log4J for Ruby 的等价物,Log4Ruby? - 2

    找了一圈也没找到。是否有Ruby的Log4X等价物?如果不是,那么处理所有调试语句的最佳方法是什么。我是Ruby的新手。谢谢! 最佳答案 Ruby带有一个内置的日志库,但是有log4r.内置库的一个简短示例:#!/usr/bin/envrubyrequire'logger'log=Logger.new('mylog.txt')log.debug"Hellolog" 关于ruby-是否有Log4JforRuby的等价物,Log4Ruby?,我们在StackOverflow上找到一个类似的问

  3. ruby-on-rails - neo4j 的哪个 Ruby REST API 客户端? - 2

    我想知道Ruby(不是JRuby,所以native绑定(bind)不是一个选项)可以使用哪些RESTAPI客户端?理想情况下,我希望API类似于neo4jgem或ActiveRecord(验证、迁移、观察者等)。当前可用的(REST)工具甚至无法与我们所拥有的相提并论,例如,在ActiveRecrod中:neograhy-只是普通RESTAPI。与模型等无关neology-只是对新地理学的包装,并不是功能齐全的ActiveModel。architect4r-符合ActiveModel,但仅提供一种查询数据的方式(Cypher语言),也不支持索引。我更喜欢architect4r的代码(主

  4. Ruby 语言备忘单/海报/引用/概述? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我是一个喜欢视觉的人,想知道是否有关于Ruby的不错的大概览。你知道,就像一张引用海报,带有对象层次结构,最常用的方法等等,都是彩色的,布局清晰明了...对于像我这样的初学者来说,这会很棒......有没有你使用或偶然发现的类似东西?

  5. Neo4j 实战(一)-- Mac neo4j 安装与配置 - 2

     前言        Neo4j是一个高性能的,Nosql图形数据库。Nosql=nosql,即与传统的将数据结构化并存储在表中的数据库不一样。Neo4j将数据存储在网络上,我们也可以把Neo4j视为一个图引擎。我们打交道的是一个面对对象的、灵活的网络结构而不是严格的、静态的表。传统关系型数据库,当数据量很大时,查询性能会明显受影响,尤其是一度以上的查询。但是图形数据库却在这方面表现得很好。neo4j支持多种主流编程语言,包括.Net、Java、JavaScript、Python。本文主要是涉及到jdk和neo4j安装和适配。        注意事项:neo4j安装版本与JDK版本需要对应,不

  6. javascript - Visual Studio 2015 Javascript 概述方式太多 - 2

    VisualStudio2015接缝勾勒出所有多行javascript代码。我有一个像这样的简单代码:$(document).ready(function(){varx={test1:1,test2:2};if(1==1){//thisisatest}});当我按下Ctrl+k,Ctrl+O时,VisualStudio2015会这样概括它:是否可以关闭函数内的大纲?我只想要功能级别的大纲。 最佳答案 不,你做不到,但有优秀的WebEssentials可以在javascript中勾勒出区域!你在像这样的评论之后创建一个区域//#reg

  7. javascript - 如何使用 <a4j :jsFunction><a4j:actionparam> - 2

    我正在尝试使用:functionmyfunc(){varparam=4;alert("OK");}我这样调用函数:但它不起作用。可能是什么原因? 最佳答案 你误解了的目的.它自动生成一个JavaScript函数,然后您可以从View中的任何JavaScript代码调用该函数。你的例子,将自动生成以下函数functionmyfunc(param){//HeresomespecificJSFAjaxscriptwhichassigns"param"//toamanagedbeanproperty#{MyBean.myfield}}您不需

  8. javascript - 如何使用 bolt 协议(protocol)(javascript)将对象数组(批量插入)插入到 neo4j 中 - 2

    1.向服务器发送带有对象数组的httppost[{id:1,title:‘one’},{id:2,title:’two’}]2.在服务器上接收post并用bolt批量插入neo4jletdata=req.body;//setupboltletdb=require('neo4j-driver').v1;letdriver=db.driver('bolt://localhost',db.auth.basic('neo4j',’neo4j’));letsession=driver.session();3。设置执行语句//starttransactionfor(vari=0;i>data.le

  9. javascript - 使用 d3.js 复制 neo4j 浏览器可视化 - 2

    我想为我的neo4j数据创建一些可视化效果,并且在与其捆绑的浏览器中使用了一些非常好的设置,但是使用d3时似乎不太容易模拟-我的设置基于Neo4j可视化指南位于http://neo4j.com/developer/guide-data-visualization/但本指南并不能真正让您了解浏览器所达到的水平。例如,我要模拟:节点之间的多条曲线路径结束于节点边缘而不是中心的路径图表在静态位置初始化(尽管可能只是隐藏直到d3可能触发某个事件)我还没有看到任何正式的CSS/JS版本获得相同的效果,所以我猜想用户会从头开始编写代码。是否有任何其他选择可以快速实现这一目标?非常感谢

  10. javascript - 在 a4j :commandButton 中打开一个新窗口 - 2

    在Web应用程序中使用A4J、Richfaces,当用户单击时,我需要打开一个新的浏览器窗口.我想我将不得不使用window.open(URL,...).我应该把它放在哪里?我的看起来像这样: 最佳答案 您可以确认window.open而不是returnfalse“Else”是可选的,也许不是必需的。或者您可以更改表单目标。我不太记得它的语法是否正确......或类似的东西。改变表单目标会给你一个很好的问题。其余的应用程序将以新窗口为目标。为了解决这个问题,我做了一个。关闭窗口(modalPanel)并重置表单目标。我正在使用这个(

随机推荐