1.什么是neo4j
Neo4j 是一个图形数据库,就像传统的关系数据库中的 Oracel 和 MySQL一样,用来持久化数据。
Neo4j是一个嵌入式,基于磁盘的,支持完整事务的Java持久化引擎,它在图(网络)中而不是表中存储数据。Neo4j提供了大规模可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图,可以扩展到多台机器并行运行。相对于关系数据库来说,图数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询——在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。Neo4j重点解决了拥有大量连接的传统RDBMS在查询时出现的性能衰退问题。通过围绕图进行数据建模,Neo4j会以相同的速度遍历节点与边,其遍历速度与构成图的数据量没有任何关系。此外,Neo4j还提供了非常快的图算法、推荐系统和OLAP风格的分析,而这一切在目前的RDBMS系统中都是无法实现的。
1.1特点
SQL就像简单的查询语言Neo4j CQL
它遵循属性图数据模型
它通过使用Apache Lucence支持索引
它支持UNIQUE约束
它它包含一个用于执行CQL命令的UI:Neo4j数据浏览器
它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
它采用原生图形库与本地GPE(图形处理引擎)
它支持查询的数据导出到JSON和XLS格式
它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问
它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本
它支持两种Java API:Cypher API和Native Java API来开发Java应用程序
1.2优点
它很容易表示连接的数据
检索/遍历/导航更多的连接数据是非常容易和快速的
它非常容易地表示半结构化数据
Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
它使用简单而强大的数据模型
它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引它很容易表示连接的数据
检索/遍历/导航更多的连接数据是非常容易和快速的
它非常容易地表示半结构化数据
Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
它使用简单而强大的数据模型
它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引
2.neo4j下载安装
官网:https://neo4j.com/download
Neo4j的操作语言称为cyher,跟sql是一个道理。
除上面的create语句以外,Neo4j的cypher语法跟sql一样,涵盖了neo4j数据库CRUD的各个方面,还包括调用存储过程
Neo4j图形数据库的主要构建块是:
节点:是图表的基本单位。 它包含具有键值对的属性
关系:连接两个节点,具有方向:单向和双向。每个关系包含“开始节点”或“从节点”和“到节点”或“结束节点”。关系也可以包含属性作为键值对。
属性:是用于描述图节点和关系的键值对。Key =值,其中Key是一个字符串,值可以通过使用任何Neo4j数据类型来表示
标签:将节点分组为集合。将一个公共名称与一组节点或关系相关联。 节点或关系可以包含一个或多个标签。 我们可以为现有节点或关系创建新标签。 我们可以从现有节点或关系中删除现有标签。
数据浏览器:用于执行CQL命令并查看输出输出。等
3.neo4j的CQL操作
常用的Neo4j CQL命令/条款如下:
S.No. CQL命令/条 用法
1。 CREATE 创建 创建节点,关系和属性
2。 MATCH 匹配 检索有关节点,关系和属性数据
3。 RETURN 返回 返回查询结果
4。 WHERE 哪里 提供条件过滤检索数据
5。 DELETE 删除 删除节点和关系
6。 REMOVE 移除 删除节点和关系的属性
7。 ORDER BY以…排序 排序检索数据
8。 SET 组 添加或更新标签
常用函数
S.No. 定制列表功能 用法
1。 String 字符串 它们用于使用String字面量。
2。 Aggregation 聚合 它们用于对CQL查询结果执行一些聚合操作。
3。 Relationship 关系 他们用于获取关系的细节,如startnode,endnode等。
数据类型
S.No. CQL数据类型 用法
- boolean 用于表示布尔文字:true,false。
- byte 用于表示8位整数。
- short 用于表示16位整数。
- int 用于表示32位整数。
- long 用于表示64位整数。
- float I用于表示32位浮点数。
- double 用于表示64位浮点数。
- char 用于表示16位字符。
- String 用于表示字符串。
3.1增
创建唯一约束键,(只能在数据库还没有插入数据时设置)
create(drop) constraint on (a:person)assert a.name is unique
创建索引
create index on:person(name)
插入节点,插入一个preson类别的节点,且这个节点有name,属性值为 andres
create(n:person{name:"andres"})
插入边,插入一条A daoB的有向边,且边类别为follow
match(a:preson),(b:person)
where a.name="nODE a" and b.name="node b"
create(a)-[r:Follow]->(b);
3.2改
更新节点
match(n:person{name:anders})
set n.name="Taylor"
3.3删
删除索引
drop index on:person(name)
删除节点和其相连的边 如果一个节点有边相连,是不能单删除这个节点的
match (n:person{name:andres})
detach delete n;
删除边
match (a:preson)-[r:follow]->(b:preson)
where a.name=""and b.name=""
delete r
删除所有节点和关系
match(n)
optional match(n)-[r]-()
delete n,r
3.4查
最短路径
match(a:preson{name:""}),(b:preson{name:""}),
p=shortestpath((a)-[r:follow]-(b))return p;
两个节点的关系
match(a:preson{name:})-[r]->(b:presom{name:""})
return type(r);
查询一个节点的所有Follow
match(:preson{name:“”})-[r:follow]->(preson)
return preson.name
4.文件导入
找到neo4j的安装路径,并在D:\neo4j-community-3.4.0\目录下创建import目录
完整路径如下D:\neo4j-community-3.4.0\import
因为neo4j支持导入csv文件,其默认目录入口是 ...\import
//导入节点 电影类型 == 注意类型转换
LOAD CSV WITH HEADERS FROM "file:///genre.csv" AS line
MERGE (p:Genre{gid:toInteger(line.gid),name:line.gname})
//导入节点 演员信息
LOAD CSV WITH HEADERS FROM 'file:///person.csv' AS line
MERGE (p:Person { pid:toInteger(line.pid),birth:line.birth,
death:line.death,name:line.name,
biography:line.biography,
birthplace:line.birthplace})
// 导入节点 电影信息
LOAD CSV WITH HEADERS FROM "file:///movie.csv" AS line
MERGE (p:Movie{mid:toInteger(line.mid),title:line.title,introduction:line.introduction,
rating:toFloat(line.rating),releasedate:line.releasedate})
// 导入关系 actedin 电影是谁参演的 1对多
LOAD CSV WITH HEADERS FROM "file:///person_to_movie.csv" AS line
match (from:Person{pid:toInteger(line.pid)}),(to:Movie{mid:toInteger(line.mid)})
merge (from)-[r:actedin{pid:toInteger(line.pid),mid:toInteger(line.mid)}]->(to)
//导入关系 电影是什么类型 == 1对多
LOAD CSV WITH HEADERS FROM "file:///movie_to_genre.csv" AS line
match (from:Movie{mid:toInteger(line.mid)}),(to:Genre{gid:toInteger(line.gid)})
merge (from)-[r:is{mid:toInteger(line.mid),gid:toInteger(line.gid)}]->(to)