赞
踩
图数据库是基于图论实现的一种NOSQL数据库,其数据结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据。
图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系====
Neo4j
是一个高性能的,NOSQL
图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java
持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j
也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
NOSQL
大致分为4种
- 键值(key/val)数据库
- 列存储数据库
- 文档数据库
- 图数据库
对比关系型数据库
关系型数据库 | 图数据库 |
---|---|
表 | 图 |
行 | 节点 |
列和数据 | 属性和数据 |
约束 | 关系 |
在Neo4j
中,一个节点可以有一个以上的标签,从现实世界的角度去看,一个标签可以认为节点的某个类别。
节点是指一个实实在在的对象,这个对象可以有好多的标签,表示对象的种类,也可以有好多的属性,描述其特征,节点与节点之间还可以形成多个有方向(或者没有方向)的关系。
在Neo4j中,节点和关系都可以包含属性。
用来描述节点与节点之间的关系,这也是图数据与与普通数据库最大的区别,正是因为有这些关系的存在,才可以描述那些我们普通行列数据库所很难表示的网状关系,比如我们复杂的人际关系网,所谓的六度理论,就可以很方便的用图数据库进行模拟,比如我们大脑神经元之间的连接方式,都是一张复杂的网。
有一点需要重点注意,关系可以拥有属性。
描述节点的特性,采用的是Key-Value
结构,可以随意设定来描述节点的特征。键名是字符串。
注意:null不是一个合法的属性值。 Nulls能代替模仿一个不存在的Key。
文档地址: https://neo4j.com/docs/cypher-manual/current/clauses/match/
CQL命令 | 含义 | 用法 |
---|---|---|
CREATE | 创建 | 创建节点,关系和 |
MATCH | 匹配 | 检索有关节点,关系和属性数据 |
RETURN | 返回 | 返回查询结果 |
WHERE | 哪里 | 提供条件过滤检索数据 |
DELETE | 删除 | 删除节点和关系 |
REMOVE | 移除 | 删除节点和关系的属性 |
ORDER BY | 排序 | 排序检索数据 |
SET | 组 | 添加或更新标签 |
CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)
create (n:`海贼王`{name:"路飞"}) RETURN n;
create (n1:`海贼王`{name:"罗宾"}),(n2:`海贼王`{name:"山治"}),(n3:`海贼王`{name:"罗罗诺亚·索隆"}) RETURN n1,n2,n2;
// 多个标签
CREATE (h:`海贼王`:`船只`{name:"万里阳光号",captain:"路飞"})
// 新节点+新关系
CREATE
(<node1-label-name>:<node1-name>)-
[<relationship-label-name>:<relationship-name>]->
(<node1-label-name>:<node1-name>)
RETURN <relationship-label-name>
create a = (p1:`海贼王`{name:"娜美"})-[r:同盟{name:"草帽海贼团"}]->(p2:`海贼王`{name:"乔巴"}) return a
// 现有节点+新的关系
MATCH (p1:`海贼王`{name:"路飞"}),(p2:`海贼王`{name:"山治"})
CREATE (p1)<-[r:同盟{name:"草帽海贼团"}]-(p2)
RETURN p1,r,p2;
语法说明
语法元素 | 描述 |
---|---|
它是我们将要创建的节点名称。 | |
它是一个节点标签名称 | |
… | 属性是键值对。 定义将分配给创建节点的属性的名称 |
… | 属性是键值对。 定义将分配给创建节点的属性的值 |
MATCH
(
<node-name>:<label-name>
)
RETURN
<node-name>.<Property1-name>,
......
<node-name>.<Propertyn-name>
MATCH (n:`海贼王`) RETURN n LIMIT 25
MATCH (n:`海贼王`) RETURN n.name LIMIT 25
DELETE <node-name-list>
语法元素 | 描述 |
---|---|
DELETE | 它是一个Neo4j CQL关键字。 |
它是一个要从数据库中删除的节点名称列表。 |
// 先通过匹配关键字match找到匹配元素,然后通过delete关键字指定删除
match(p:海贼王{name:"山治"}) delete p;
// 删除关系
MATCH a = (p:海贼王{name:"路飞"})<-[r:belong_to]-(c:船只{name:"万里阳光号"}) delete p,r,c;
SET <property-name-list>
描述 | |
---|---|
SET | 它是一个 Neo4j 的 CQL 关键字。 |
它是一个属性列表,用于执行添加或更新操作以满足我们的要求。 |
MATCH (p:海贼王{name:"路飞"}) SET p.fruit = '橡胶果实' RETURN p;MATCH (p:海贼王{name:"路飞"}) SET p.title = '吃货' RETURN p;
REMOVE <property-name-list>
语法元素 | 描述 |
---|---|
REMOVE | 它是一个Neo4j CQL关键字。 |
它是一个属性列表,用于永久性地从节点或关系中删除它。 |
MATCH (p:海贼王{name:"路飞"}) REMOVE p.title RETURN p;
明星关系图谱 http://47.108.84.95:8080/browser/
MATCH p = (Start {name: '周杰伦'})-->() RETURN p //有关系的人MATCH p = (:Start{name: '周杰伦'})-[:绯闻]-> (person) RETURN p;MATCH p = (:Start{name: '周杰伦'}) -[:绯闻]-> (c) <-[:绯闻]-(s) RETURN p;//多重关系MATCH p = (:Start{name: '周杰伦'}) -[:绯闻*2..3]-> (c) RETURN p;//可变长度关系
MATCH p = shortestPath((:Start{name:"周杰伦"})-[*..15]-(:Start{name:"郭富城"}))RETURN pMATCH (s) with s,SIZE(()-[:`绯闻`]-(s)) as cnt order by cnt desc limit 1 MATCH p = (a)-[:`绯闻`]-(s) return p;MATCH (s) with s,SIZE(()-[]-(s)) as cnt order by cnt desc limit 3 MATCH p = (a)-[]-(s) return p;
如果它不存在于图中,则它创建新的节点/关系并返回结果。
在Neo4j中,“Id”是节点和关系的默认内部属性。 这意味着,当我们创建一个新的节点或关系时,Neo4j数据库服务器将为内部使用分配一个数字。 它会自动递增。
两个节点之间的关系是有方向性的。 它们是单向或双向的。
由于Neo4j遵循属性图数据模型,它应该只支持方向关系。 如果我们尝试创建一个没有任何方向的关系,那么Neo4j DB服务器应该抛出一个错误。
它使用一个箭头标记:()-[]->()
。 它表示从左侧节点到右侧节点的方向。
ORDER BY,UNION,UNION ALL,LIMIT,IN
SKIP 从头截取 跳过
定制列表功能 | 含义 | 用法 |
---|---|---|
String | 字符串 | 用于使用String字面量 |
Aggregation | 聚合 | 用于对CQL查询结果执行一些聚合操作 |
Relationship | 关系 | 用于获取关系的细节,如startnode,endnode等 |
功能 | 描述 |
---|---|
UPPER | 它用于将所有字母更改为大写字母。 |
LOWER | 它用于将所有字母改为小写字母。 |
SUBSTRING | 它用于获取给定String的子字符串。 |
REPLACE | 它用于替换一个字符串的子字符串。 |
功能 | 描述 | |
---|---|---|
COUNT | 它返回由MATCH命令返回的行数。 | |
MAX | 它从MATCH命令返回的一组行返回最大值。 | |
MIN | 它返回由MATCH命令返回的一组行的最小值。 | |
SUM | 它返回由MATCH命令返回的所有行的求和值。 | |
AVG | 它返回由MATCH命令返回的所有行的平均值。 | |
collect | 函数collect() 返回一个聚合列表,其中包含表达式返回的值。 | |
labels | 返回节点所有标签 |
keys() | keys返回一个列表,其中包含节点、关系或映射的所有属性名称的字符串表示形式。 |
---|---|
labels() | labels返回一个列表,其中包含节点所有标签的字符串表示形式。 |
nodes() | nodes()返回包含路径中所有节点的列表。 |
reduce() | reduce()返回在列表中的每个连续元素上应用表达式所产生的值,以及迄今为止的计算结果。 |
relationships() | relationships()返回包含路径中所有关系的列表。 |
tail() | tail()返回一个列表lresult,其中包含列表中除第一个元素以外的所有元素。 |
shortestPath() | 返回最短关系 |
… | … |
功能 | 描述 |
---|---|
STARTNODE | 它用于知道关系的开始节点。 |
ENDNODE | 它用于知道关系的结束节点。 |
ID | 它用于知道关系的ID。 |
TYPE | 它用于知道字符串表示中的一个关系的TYPE。 |
时间函数-持续时间,标量型函数 等等等…
CREATE INDEX ON :<label_name> (<property_name>) //低版本create index FOR(n:Label)ON(n.property)DROP INDEX index_name//create index FOR (n:`海贼王`) ON (n.name)
注意:- 冒号(:)运算符用于引用节点或关系标签名称。
上述语法描述它在节点或关系的<label_name>的<property_name>上创建一个新索引。
CREATE CONSTRAINT ON (<label_name>) ASSERT <property_name> IS UNIQUEDROP CONSTRAINT ON (<label_name>) ASSERT <property_name> IS UNIQUE
:schema 查看索引是否创建成功,一定要显示ONLINE才会生效
explain 如果只想查看查询计划,而不想运行该语句,可以在查询语句中加入EXPLAIN。
阅读执行计划时要记住的第一件事是,需要自下而上地阅读。
PROFILE 如果想运行查询语句并查看哪个运算符占了大部分的工作,可以使用PROFILE。此时,该语句将被运行,并跟踪传递了多少行数据给每个运算符,以及每个运算符与存储层交互了多少以获取必要的数据。注意,加入PROFILE的查询语句将占用更多的资源,所以除非真正在做性能分析,否则不要使用PROFILE。
执行计划
执行查询的任务被分解为操作符,每个操作符执行一个特定的工作。这些运算符组合成一个树状结构,称为执行计划。执行计划中的每个操作符都表示为树中的一个节点。每个运算符将零或更多行作为输入,并产生零或更多行作为输出。这意味着一个操作员的输出成为下一个操作员的输入。连接树中两个分支的运算符组合来自两个传入流的输入并产生单个输出。
评价模型
执行计划的评估从树的叶节点开始。叶节点没有输入行,通常包括诸如扫描和查找之类的操作符。这些算子直接从存储引擎获取数据,从而导致数据库命中。叶节点产生的任何行然后都通过管道传输到它们的父节点,而父节点又将它们的输出行通过管道传输到它们的父节点,依此类推,一直到根节点。根节点产生查询的最终结果。
急切和懒惰的评价
通常,查询评估是惰性的:大多数操作符一生成就将它们的输出行通过管道传递给它们的父操作符。这意味着在父运算符开始使用子运算符生成的输入行之前,子运算符可能不会完全耗尽。但是,某些运算符(例如用于聚合和排序的运算符)需要聚合所有行才能产生输出。在将任何行作为输入发送到其父级之前,此类运算符需要完整执行。这些操作符称为急切操作符,在执行计划操作符一目了然中被这样表示。急切会导致内存使用率过高,因此可能是查询性能问题的原因。
节点标签,关系类型和属性区分大小写,这意味着,例如,属性的name含义不同于属性Name。
建议遵循下表中描述的命名约定:
图实体 | 推荐 | 例 |
---|---|---|
节点标签 | 大驼峰,以大写字母开头 | :WangYuan |
关系类型 | 大写,使用下划线分隔单词 | :WANG_YUAN |
属性 | 小写驼峰字母 | :wangYuan |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。