一、 安装
首先安装 jdk并配置好环境变量。在下载neo4j 并配好环境变量。
参考网址 :https://blog.youkuaiyun.com/qq_38335648/article/details/115027676
1、官网下载合适版本,下载链接 4.0版本以上就需要jdk11支持了
2、解压安装包
3、bin目录下打开cmd
4、neo4j.bat install-service安装neo4j服务
5、neo4j.bat start启动
6、使用浏览器neo4j http://127.0.0.1:7474/
默认的账号是 neo4j 密码 neo4j 这里第一次登录的话会要求修改密码
二、Cypher图像查询语言
Cypher 是一种声明式图查询语言,允许对图进行富有表现力和高效[的查询、更新和管理](https://link.zhihu.com/?target=https%3A//neo4j.com/docs/cypher-manual/current/introduction/quering-updating-administering/)。由于它与其他语言的相似性和直观性,它是迄今为止最容易学习的图形语言。
cypher是用来查询neo4j图数据中的数据
cypher语法:
从上图可知:
Sally喜欢图表技术,
Sally与John是朋友,
Sally在Neo4j公司工作
图数据库包括::节点(节点标签、节点属性)、关系(关系类型、关系属性)
1.节点表示
Cypher 中的节点,是使用括号将节点括起来,例如(node),括号看起来与可视化表示用于我们数据模型中节点的圆圈的相似之处。节点的任何信息都可以卸载括里面包括:节点变量、节点标签、节点属性
- 节点变量 如果我们查询到一个节点,然后想在查询后返回节点,我们就需要定义一个变量,就如果我们在java调数据库查到数据需要对象接收一样,如果不定义就无法在后续使用数据
- 节点标签 上述图中我们可以看到每个节点都有标签,如果我们想筛选指定标签的数据或给节点创建标签,我们可以指定节点标签,如图中的Person,Technology、 和Company
- 节点属性 如图中的节点属性,如果我们想要按照属性筛选或给节点创建属性,可以指定属性
示例:
(p:Person {name: 'Sally'})
(:Person {name: 'Sally'})
p为变量,Person为标签,{name: ‘Sally’}为属性
2.关系表示
关系在 Cypher 中使用箭头–>或<–两个节点之间表示,语法看起来像在表示中连接我们的节点的箭头和线。无向关系表示为没有箭头,只有两个破折号–,虽然插入必须有方向,但是在查询的时候如果不知道方向也是可以不指定,这意味着可以在任一方向上遍历关系
有关关系的信息,我们可以使用 [] 中括号编写,有关关系的任何信息都可以写在中括号中,如下述示例
(p:Person)-[rel:LIKES {type:'Graphs'}]->(t:Technology)
(p:Person)<-[rel:LIKES {type: 'Graphs'}]-(t:Technology)
(p:Person)-[rel:LIKES {type: 'Graphs'}]-(t:Technology)
也可以将一个sql赋值一个变量,可以在语句其他地方使用
sql = (p:Person)-[rel:LIKES {type: 'Graphs'}]->(t:Technology)
3.Cypher语法实践
S.No | Cypher关键字 | 作用 |
---|---|---|
1 | CREATE 创建 | 创建节点,关系和属性 |
2 | MATCH 匹配 | 检索有关节点,关系和属性数据 |
3 | RETURN 返回 | 返回查询结果 |
4 | WHERE 条件 | 提供条件过滤检索MATCH数据 |
5 | DELETE 删除 | 删除节点和关系 |
6 | REMOVE 移除 | 删除节点和关系的属性 |
7 | SET 设置 | 添加或更新标签 |
8 | ORDER BY 排序 | 对结果排序 |
9 | SKIP LIMIT 分页 | 分页 |
10 | DISTINCT 排重 | 排重 |
3.1 创建操作
创建结点
#创建单个节点
CREATE (n)
#创建多个节点
CREATE (n), (m)
#创建带有单个标签的节点
CREATE (n:Person)
#创建带有多个标签的节点
CREATE (n:Person:Swedish)
#创建带有标签和属性的节点并返回
CREATE (n:Person {name: 'Andy', title: 'Developer'}) return n.name,n.title
#创建一个电影节点
CREATE (m:Movie {title:'测试电影'})
创建关系
#创建已知节点之间的关系,并设置属性
match (p:Person),(m:Movie)
where p.name = 'Andy' and p.title = 'Developer' and m.title = '测试电影'
create (p)-[r:ACTED_IN {year:1980}]->(m)
return p,r,m
#创建新的节点并创建关系
create (p:Person {name:"Jry"})-[r:WORK_FOR]->(m:michael{name:'Mich'})
return p,r,m
创建安装链路
#创建完整链路
create p = (Person {name:"Tom"})-[:WORK_FOR]->(michael{name:'Michael'})
return p
3.2 MERGE操作
MERGE操作会先进行查询,如果未查询到会进行新建操作
#新建一个张三节点
merge (p:Person {name:'张三'})
return p
#还是新建张三并进行属性匹配,由于属性不完全匹配还是新增操作,可以看到id不同
merge (p:Person {name:'张三',height:185})
return p
#匹配存在的节点
merge (p:Person {name:'张三',height:185})
return p
#以现有节点属性去匹配新增节点
MATCH (person:Person)MERGE (city:City {name: person.bornIn})
RETURN person.name, person.bornIn, city
#创建节点时设置额外属性
MERGE (keanu:Person {name: '李四'})
ON CREATE
SET keanu.created = timestamp()
RETURN keanu.name, keanu.created
#找到节点时设置额外属性
MERGE (person:Person {name:'张三'})
ON MATCH
SET person.found = true
RETURN person.name, person.found
#ON CREATE/ON MATCH可以一起使用
#关系不存在创建关系
MATCH
(charlie:Person {name: '张三'}),
(wallStreet:Movie {title: '测试电影'})
MERGE (charlie)-[r:ACTED_IN]->(wallStreet)
RETURN charlie.name, type(r), wallStreet.title
更多merge操作参考官方文档: https://link.zhihu.com/?target=https%3A//neo4j.com/docs/cypher-manual/current/clauses/merge/%23merge-merge-on-a-relationship-between-two-existing-nodes
3.3 SET操作
set操作可以用来做更新操作
新增属性
#设置属性
MATCH (n {name: '张三'})
SET n.surname = '胖墩'
RETURN n.name, n.surname
#使用case-when设置属性
MATCH (n {name: '张三'})
SET (CASE WHEN n.height = 185 THEN n END).worksIn = '工厂'
RETURN n.name, n.worksIn
更新属性
MATCH (n {name: '张三'})
SET n.height = toString(n.height)
RETURN n.name, n.height
删除属性
#删除单个属性
MATCH (n {name: '张三'})
SET n.height = null
RETURN n.name, n.height
#删除所有属性
MATCH (p {name: 'Jry'})
SET p = {}
RETURN p.name
3.4 DELETE操作
delete可以进行删除节点操作,前提是需要将节点上的关系清除
MATCH (n:Person {name: '李四'})
DELETE n
#当数据量不大,我们想清除所有数据
MATCH (n)
DETACH DELETE n
#删除节点及所有关系
MATCH (n {name: 'Andy'})
DETACH DELETE n
#只删除关系
MATCH (n {name: 'Tom'})-[r:KNOWS]->()
DELETE r
3.5 REMOVE操作
remove主要用来删除属性和标签
Neo4j 不允许存储null在属性中。相反,如果不存在值,则该属性不存在
#删除属性
MATCH (a {name: '张三'})
REMOVE a.height
RETURN a.name, a.height
#删除标签
MATCH (n {name: 'Tom'})
REMOVE n:Person
RETURN n.name, labels(n)
#删除多个标签
MATCH (n {name: 'Tom'})
REMOVE n:Person:Movie
RETURN n.name, labels(n)
此篇为学习笔记,neo4j入门教程参考学习链接
【知识图谱】Neo4j入门教程 - 知乎 (zhihu.com)