当前位置:   article > 正文

图数据库Neo4简介-CQL语法_neo4j cql 任意label

neo4j cql 任意label

图数据库Neo4j

一、什么是图数据库?

图数据库是基于图论实现的一种NOSQL数据库,其数据结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据。

图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系====

Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。

NOSQL大致分为4种

  • 键值(key/val)数据库
  • 列存储数据库
  • 文档数据库
  • 图数据库

对比关系型数据库

关系型数据库图数据库
节点
列和数据属性和数据
约束关系

二、Neo4j的特点

  • SQL就像简单的查询语言Neo4j CQL
  • 它遵循属性图数据模型
  • 它通过使用Apache Lucence支持索引
  • 它支持UNIQUE约束
  • 它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
  • 它采用原生图形库与本地GPE(图形处理引擎)
  • 它支持查询的数据导出到JSON和XLS格式
  • 它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问
  • 它支持两种Java API: Cypher API和Native Java API来开发Java应用程序

三、基础概念

1. 标签(Label)

Neo4j中,一个节点可以有一个以上的标签,从现实世界的角度去看,一个标签可以认为节点的某个类别。

2. 节点(Node)

节点是指一个实实在在的对象,这个对象可以有好多的标签,表示对象的种类,也可以有好多的属性,描述其特征,节点与节点之间还可以形成多个有方向(或者没有方向)的关系。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1resWTfn-1632462978974)(images\image-20210912133833960.png)]

在Neo4j中,节点和关系都可以包含属性。

3. 关系(Relationship)

用来描述节点与节点之间的关系,这也是图数据与与普通数据库最大的区别,正是因为有这些关系的存在,才可以描述那些我们普通行列数据库所很难表示的网状关系,比如我们复杂的人际关系网,所谓的六度理论,就可以很方便的用图数据库进行模拟,比如我们大脑神经元之间的连接方式,都是一张复杂的网。

有一点需要重点注意,关系可以拥有属性。

4. 属性(Property)

描述节点的特性,采用的是Key-Value结构,可以随意设定来描述节点的特征。键名是字符串。

注意:null不是一个合法的属性值。 Nulls能代替模仿一个不存在的Key。

四、Cypher查询语法(CQL)

  • 它是Neo4j图形数据库的查询语言。
  • 它是一种声明性模式匹配语言
  • 它遵循SQL语法。
1、命令

文档地址: https://neo4j.com/docs/cypher-manual/current/clauses/match/

CQL命令含义用法
CREATE创建创建节点,关系和
MATCH匹配检索有关节点,关系和属性数据
RETURN返回返回查询结果
WHERE哪里提供条件过滤检索数据
DELETE删除删除节点和关系
REMOVE移除删除节点和关系的属性
ORDER BY排序排序检索数据
SET添加或更新标签
CREATE命令语法
CREATE (
   <node-name>:<label-name>
   { 	
      <Property1-name>:<Property1-Value>
      ........
      <Propertyn-name>:<Propertyn-Value>
   }
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
create (n:`海贼王`{name:"路飞"}) RETURN n;

create (n1:`海贼王`{name:"罗宾"}),(n2:`海贼王`{name:"山治"}),(n3:`海贼王`{name:"罗罗诺亚·索隆"}) RETURN n1,n2,n2;

// 多个标签
CREATE (h:`海贼王`:`船只`{name:"万里阳光号",captain:"路飞"})


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
// 新节点+新关系
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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

语法说明

语法元素描述
它是我们将要创建的节点名称。
它是一个节点标签名称
属性是键值对。 定义将分配给创建节点的属性的名称
属性是键值对。 定义将分配给创建节点的属性的值
MATCH & RETURN命令语法
MATCH
(
	<node-name>:<label-name>
)
RETURN
	<node-name>.<Property1-name>,
	......
	<node-name>.<Propertyn-name>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
MATCH (n:`海贼王`) RETURN n LIMIT 25
MATCH (n:`海贼王`) RETURN n.name LIMIT 25
  • 1
  • 2
DELETE命令语法
  • 删除节点。
  • 删除节点及相关节点和关系。
DELETE <node-name-list>
  • 1
语法元素描述
DELETE它是一个Neo4j CQL关键字。
它是一个要从数据库中删除的节点名称列表。
// 先通过匹配关键字match找到匹配元素,然后通过delete关键字指定删除
match(p:海贼王{name:"山治"}) delete p;

// 删除关系
MATCH a = (p:海贼王{name:"路飞"})<-[r:belong_to]-(c:船只{name:"万里阳光号"}) delete p,r,c;
  • 1
  • 2
  • 3
  • 4
  • 5
SET子句
  • 向现有节点或关系添加新属性
  • 添加或更新属性值
SET  <property-name-list>
  • 1
描述
SET它是一个 Neo4j 的 CQL 关键字。
它是一个属性列表,用于执行添加或更新操作以满足我们的要求。
MATCH (p:海贼王{name:"路飞"}) SET p.fruit = '橡胶果实' RETURN p;MATCH (p:海贼王{name:"路飞"}) SET p.title = '吃货' RETURN p;
  • 1
REMOVE删除
  • 删除节点或关系的标签
  • 删除节点或关系的属性
REMOVE <property-name-list>
  • 1
语法元素描述
REMOVE它是一个Neo4j CQL关键字。
它是一个属性列表,用于永久性地从节点或关系中删除它。
MATCH (p:海贼王{name:"路飞"}) REMOVE  p.title RETURN p;
  • 1
MATCH命令

明星关系图谱 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;//可变长度关系
  • 1
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;
  • 1
MERGE命令
  • 创建节点,关系和属性
  • 为从数据库检索数据

如果它不存在于图中,则它创建新的节点/关系并返回结果。

ID属性

在Neo4j中,“Id”是节点和关系的默认内部属性。 这意味着,当我们创建一个新的节点或关系时,Neo4j数据库服务器将为内部使用分配一个数字。 它会自动递增。

方向关系

两个节点之间的关系是有方向性的。 它们是单向或双向的。

由于Neo4j遵循属性图数据模型,它应该只支持方向关系。 如果我们尝试创建一个没有任何方向的关系,那么Neo4j DB服务器应该抛出一个错误。

它使用一个箭头标记:()-[]->()。 它表示从左侧节点到右侧节点的方向。

OTHER

ORDER BY,UNION,UNION ALL,LIMIT,IN

SKIP 从头截取 跳过

2、函数
定制列表功能含义用法
String字符串用于使用String字面量
Aggregation聚合用于对CQL查询结果执行一些聚合操作
Relationship关系用于获取关系的细节,如startnode,endnode等
String字符串函数
功能描述
UPPER它用于将所有字母更改为大写字母。
LOWER它用于将所有字母改为小写字母。
SUBSTRING它用于获取给定String的子字符串。
REPLACE它用于替换一个字符串的子字符串。
Aggregation聚合
功能描述
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()返回最短关系
Relationship关系
功能描述
STARTNODE它用于知道关系的开始节点。
ENDNODE它用于知道关系的结束节点。
ID它用于知道关系的ID。
TYPE它用于知道字符串表示中的一个关系的TYPE。

时间函数-持续时间,标量型函数 等等等…

五、Neo4J索引操作

  • Create Index 创建索引
  • Drop Index 删除索引
创建索引的语法
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)
  • 1

注意:- 冒号(:)运算符用于引用节点或关系标签名称。

上述语法描述它在节点或关系的<label_name>的<property_name>上创建一个新索引。

UNIQUE约束
CREATE CONSTRAINT ON (<label_name>) ASSERT <property_name> IS UNIQUEDROP CONSTRAINT ON (<label_name>) ASSERT <property_name> IS UNIQUE
  • 1
  • :schema 查看索引是否创建成功,一定要显示ONLINE才会生效

  • explain 如果只想查看查询计划,而不想运行该语句,可以在查询语句中加入EXPLAIN。

    阅读执行计划时要记住的第一件事是,需要自下而上地阅读。

  • PROFILE 如果想运行查询语句并查看哪个运算符占了大部分的工作,可以使用PROFILE。此时,该语句将被运行,并跟踪传递了多少行数据给每个运算符,以及每个运算符与存储层交互了多少以获取必要的数据。注意,加入PROFILE的查询语句将占用更多的资源,所以除非真正在做性能分析,否则不要使用PROFILE。

  • 执行计划
    执行查询的任务被分解为操作符,每个操作符执行一个特定的工作。这些运算符组合成一个树状结构,称为执行计划。执行计划中的每个操作符都表示为树中的一个节点。每个运算符将零或更多行作为输入,并产生零或更多行作为输出。这意味着一个操作员的输出成为下一个操作员的输入。连接树中两个分支的运算符组合来自两个传入流的输入并产生单个输出。

  • 评价模型
    执行计划的评估从树的叶节点开始。叶节点没有输入行,通常包括诸如扫描和查找之类的操作符。这些算子直接从存储引擎获取数据,从而导致数据库命中。叶节点产生的任何行然后都通过管道传输到它们的父节点,而父节点又将它们的输出行通过管道传输到它们的父节点,依此类推,一直到根节点。根节点产生查询的最终结果。

  • 急切和懒惰的评价
    通常,查询评估是惰性的:大多数操作符一生成就将它们的输出行通过管道传递给它们的父操作符。这意味着在父运算符开始使用子运算符生成的输入行之前,子运算符可能不会完全耗尽。但是,某些运算符(例如用于聚合和排序的运算符)需要聚合所有行才能产生输出。在将任何行作为输入发送到其父级之前,此类运算符需要完整执行。这些操作符称为急切操作符,在执行计划操作符一目了然中被这样表示。急切会导致内存使用率过高,因此可能是查询性能问题的原因。

六、命名规范

节点标签,关系类型和属性区分大小写,这意味着,例如,属性的name含义不同于属性Name。

建议遵循下表中描述的命名约定:

图实体推荐
节点标签大驼峰,以大写字母开头:WangYuan
关系类型大写,使用下划线分隔单词:WANG_YUAN
属性小写驼峰字母:wangYuan
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/1013554?sit
推荐阅读
相关标签
  

闽ICP备14008679号