Neo4j CQL基础
文章目录
- 简介
- 基本组成
- Cypher
- LOAD CSV
- 导入节点
- 导入关系
- 动态导入关系
- CREATE
- 创建节点
- 创建关系
- MATCH
- 查找节点
- 查找相连节点
- 查找特定关系
- 再谈创建关系
- MERGE
- 存在则更新,否则插入
- AOPC支持
- DELETE
- 删除特定节点
- 删除特定关系
- 删除所有节点关系
- REMOVE
- 删除属性
- 删除标签
- SET
- 添加新属性
- 修改属性值
- 添加新标签
- INDEX
- UNIQUE
- EXISTS
- ALL/ANY/NONE/SINGLE
- 常用函数
- 字符串
- 关系函数
- 最短路径
- 参考资料
简介
图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的。
图数据库擅长处理具有大量连接的数据。
基本组成
neo4j由节点、属性、关系、标签、数据浏览器组成。
一个节点或关系可以包含多个标签。
Cypher
CQL是一种声明性的模式匹配语言。
CREATE | 创建节点、关系和属性 |
---|---|
MATCH | 检索有关节点、关系和属性 |
RETURN | 返回查询结果 |
WHERE | 提供条件过滤 |
DELETE | 删除节点和关系 |
REMOVE | 删除节点和关系的属性 |
ORDER BY | 排序检索 |
SET | 添加或更新标签 |
DISTINCT | 对返回结果进行去重 |
COUNT | 返回个数 |
EXISTS | 是否存在 |
ALL/ANY/NONE/SINGLE | 检查集合元素 |
LOAD CSV
注意:数据存放在db\import
下才能访问(db是对应数据库)。
用python导入关系教程:Python导入关系
导入节点
LOAD CSV WITH HEADERS FROM 'file:///station_name_res.csv' AS line
CREATE (:Station {name:line.name, englishname:line.english, stationid:line.id})
导入关系
有了节点之后导入对应关系。
LOAD CSV WITH HEADERS FROM 'file:///route_name_res.csv' AS line
MATCH (from:Station{name:line.name1}),(to:Station{name:line.name2})
MERGE(from)-[r:NEAR{name:line.routeName,routeNumber:line.routeNumber,direction:line.direction,type:line.type}]->(to)
动态导入关系
从csv文件中动态导入关系需要插件AOPC的支持:
安装地址
安装教程
LOAD CSV WITH HEADERS FROM "file:///route_name_res.csv" AS line
MATCH (a:Station) where a.name=line.name1
MATCH (b:Station) where b.name=line.name2
WITH a, b, line
CALL apoc.create.relationship(a, line.routeName, {type:p.type}, b) YIELD rel
RETURN rel;
注:想要动态导入关系,除了使用AOPC插件,还可以将关系也作为一个节点集导入。
然后通过MATCH匹配创建关系如:
CREATE (:Star {name:line.name})...
CREATE (:StarRelation {from:line.from, to:line.to, relation:line.relation})...MATCH (n:Star),(m:StarRelation),(s:Star) WHERE m.from=n.name AND m.to=s.name
CREATE (n)-[r:关系{relation:m.relation}]->(s)
RETURN n.name,m.relation,s.name
CREATE
创建节点
创建多个标签为Person的节点,具有两个属性name、title。
CREATE (n:Person {name: 'Andy', title: 'Developer'}), (m:Person)
创建关系
创建名为RELTYPE的关系且有一个name属性。
MATCH(a:Person),(b:Person)
WHERE a.name = 'A' AND b.name = 'B'
CREATE (a)-[r:RELTYPE {name: a.name + '<->' + b.name}]->(b)
RETURN type(r), r.name
创建三个节点和其之间的关系:
CREATE p = (andy {name:'Andy'})-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael {name: 'Michael'})
RETURN p
MATCH
MATCH用来搜寻符合要求的模式,通过RETURN查看结果(有点类似SELECT)。
查找节点
查找label为Movie的所有节点:
MATCH (movie:Movie)
RETURN movie.title
neo4j也支持一些比较复杂的用法:
MATCH (n:student) WHERE n.name IS NOT NULL RETURN nMATCH (n:student) WHERE n.name IN["Mike","Jake"] RETURN n
查找相连节点
- 返回所有与’Oliver Stone’相连且label为Movie的节点。
- 返回与’Oliver Stone’相连的关系
MATCH (:Person {name: 'Oliver Stone'})--(movie:Movie)
RETURN movie.titleMATCH (:Person {name: 'Oliver Stone'})-->(movie)
RETURN movie.titleMATCH (:Person {name: 'Oliver Stone'})-[r]->(movie)
RETURN type(r)
查找特定关系
- 查找通过ACTED_IN关系与’Wall Street’相连的节点名称。
- 查找通过ACTED_IN或DIRECTED关系与’Wall Street’相连的节点名称。
MATCH (wallstreet:Movie {title: 'Wall Street'})<-[:ACTED_IN]-(actor)
RETURN actor.nameMATCH (wallstreet {title: 'Wall Street'})<-[:ACTED_IN|:DIRECTED]-(person)
RETURN person.name
再谈创建关系
可以通过MATCH匹配创建一些较复杂的关系:
MATCH (n:person {name:'Mike'}),(m:relationSet),(s:person)
WHERE m.from = 'Mike' AND s.name = m.to
CREATE (n)-[:iniRelation {relation:m.relation}] ->(s)
RETURN id(n), m.relation,id(s)
注意:id属性是neo4j自带的,因此通过函数id()
取而不是n.id
。
MERGE
MERGE可以看成MATCH + CREATE。如果MERGE命令找不到对应的数据则创建一个符合要求的数据。
找不到属性则创建:
MERGE (charlie {name: 'Charlie Sheen', age: 10})
RETURN charlie
可以设置时间戳标签来维护:
MERGE (n:Person { id: 'argan' })
ON CREATE SET n.created = timestamp()
ON MATCH SET n.lastAccessed = timestamp()
RETURN n.name, n.created, n.lastAccessed
存在则更新,否则插入
MERGE很好的实现了这一功能,让原节点n += 新的数据,MERGE会自动覆盖掉被更新的数据,并保留新数据里没有但原数据里有的属性。
MERGE (n:Node {id: 'argan'})
SET n += {id: 'argan', age: 30, sex: 'male', email: 'arganzheng@gmail.com'}
RETURN n
AOPC支持
CALL apoc.merge.node(['Label'], {id:uniqueValue}, {prop:value,...}) YIELD node;
CALL apoc.merge.relationship(startNode, 'RELTYPE', {[id:uniqueValue]}, {prop:value}, endNode) YIELD rel;
DELETE
删除特定节点
注意:这种删除方法必须该节点不存在关系,否则删不掉。
MATCH (n:Person {name: 'UNKNOWN'})
DELETE n
如果要把这个节点的关系也删除(这只是一种方法,用下面的方法也可以):
MATCH (n {name: 'Andy'})
DETACH DELETE n
删除特定关系
MATCH (n {name: 'Andy'})-[r:KNOWS]->()
DELETE r
删除所有节点关系
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
REMOVE
与DELETE相比,REMOVE主要是删除属性和标签。
删除属性
MATCH (a {name: 'Andy'})
REMOVE a.age
RETURN a.name, a.age
删除标签
MATCH (n {name: 'Peter'})
REMOVE n:German
RETURN n.name, labels(n)MATCH (n {name: 'Peter'})
REMOVE n:German:Swedish
RETURN n.name, labels(n)
SET
SET命令用于向现有节点或关系添加新属性或修改属性值。
添加新属性
MATCH (n {name: 'Andy'})
SET (CASE WHEN n.age = 36 THEN n END).worksIn = 'Malmo'
RETURN n.name, n.worksIn
修改属性值
可以将属性值设置为null
来达到remove的目的。
MATCH (n {name: 'Andy'})
SET n.age = toString(n.age)
RETURN n.name, n.age ORDER BY n.age DESC
可以同时修改多个属性:
MATCH (p {name: 'Peter'})
SET p = {name: 'Peter Smith', position: 'Entrepreneur'}
RETURN p.name, p.age, p.position
添加新标签
MATCH (n {name: 'Stefan'})
SET n:German
RETURN n.name, labels(n) AS labelsMATCH (n {name: 'George'})
SET n:Swedish:Bossman
RETURN n.name, labels(n) AS labels
INDEX
可以加上索引来加快查找速度。
将标签集Station中的name作为索引。
CREATE INDEX ON :Station (name)DROP INDEX ON :Station (name)
UNIQUE
在需要限定为唯一值的地方加上约束,保证数据唯一性。
CREATE CONSTRAINT ON (n:Station) ASSERT n.name IS UNIQUEDROP CONSTRAINT ON (n:Station) ASSERT n.name IS UNIQUE
EXISTS
如果指定的模式存在于图中,或者特定的属性存在于节点、关系或Map中,那么函数返回True。
MATCH (n)
WHERE exists(n.name)
RETURN n.name AS name, exists((n)-[:MARRIED]->()) AS is_married
ALL/ANY/NONE/SINGLE
ALL示例:
MATCH p =(a)-[*1..3]->(b)
WHERE a.name = 'Alice' AND b.name = 'Daniel' AND ALL (x IN nodes(p) WHERE x.age > 30)
RETURN p
ANY示例:
MATCH (a)
WHERE a.name = 'Eskil' AND ANY (x IN a.array WHERE x = 'one')
RETURN a.name, a.array
NONE示例:
MATCH p =(n)-[*1..3]->(b)
WHERE n.name = 'Alice' AND NONE (x IN nodes(p) WHERE x.age = 25)
RETURN p
SINGLE示例:
MATCH p =(n)-->(b)
WHERE n.name = 'Alice' AND SINGLE (var IN nodes(p) WHERE var.eyes = 'blue')
RETURN p
常用函数
字符串
neo4j的字符串下标从0开始。
UPPER | 转化为大写字母 |
---|---|
LOWER | 转化为小写字母 |
SUBSTRING(str, begin, len) | 获取子字符串 |
REPLACE | 替换 |
CONTAINS | 是否包含 |
STARTS WITH | 匹配开头 |
ENDS WITH | 匹配结尾 |
SPLIT | 将字符串分成List |
关系函数
关系函数用于了解关系的细节。
STARTNODE | 关系的开始节点 |
---|---|
ENDNODE | 关系的结束节点 |
ID | 关系ID |
TYPE | 用字符串表示的一个关系的TYPE |
最短路径
通过shortestpath
函数来计算最短路径。
MATCH (p1:Station {name: "南府街"}), (p2:Station {name: "通顺小区"}),path = shortestpath((p1)-[*]-(p2))
RETURN pathMATCH(martin:Person {name: 'Martin Sheen'}),(oliver:Person {name: 'Oliver Stone'}),p = shortestPath((martin)-[*..15]-(oliver))
RETURN p
还可以对最短路径加一些限制:
本实例寻找’Charlie Sheen’和’Martin Sheen’之间的最短路径,且不考虑FATHER关系参与的最短路。
MATCH(charlie:Person {name: 'Charlie Sheen'}),(martin:Person {name: 'Martin Sheen'}),p = shortestPath((charlie)-[*]-(martin))
WHERE none(r IN relationships(p) WHERE type(r) = 'FATHER')
RETURN p
参考资料
Cypher文档
SpringBoot+neo4j视频教程
SpringBoot配置neo4j(maven配置看这篇!)
SpringBoot整合neo4j
SpringBoot驱动模式使用neo4j
Neo4j CQL基础相关推荐
- Neo4j之CQL基础
Neo4j之CQL基础 文章目录 Neo4j之CQL基础 一.CQL概念 二.CQL简介 三.CQL命令使用 create match+return where delete remove set o ...
- Neo4j CQL(附springboot集成neo4j)
CQL代表Cypher查询语言. 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言. 常用的Neo4j CQL命令/条款如下: S.No. CQL命令/条 用法 1. CREA ...
- Neo4j - CQL简介
CQL代表Cypher查询语言. 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言. Neo4j CQL - 它是Neo4j图形数据库的查询语言. 它是一种声明性模式匹配语言 ...
- Neo4j CQL - (3) -RETURN子句
Neo4j CQL RETURN子句用于 - 检索节点的某些属性 检索节点的所有属性 检索节点和关联关系的某些属性 检索节点和关联关系的所有属性 RETURN命令语法: RETURN <node ...
- neo4j CQL使用
neo4j CQL使用 Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言.像Oracle数据库具有查询 语言SQL,Neo4j具有CQL作为查询语言. 它是Neo4 ...
- Neo4j - CQL使用
3.1 Neo4j - CQL简介 Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言.像Oracle数据库具有查询 语言SQL,Neo4j具有CQL作为查询语言. ...
- Neo4j CQL简介
CQL CQL 代表 Cypher 查询语言.像 Orcale 数据库具有查询语言 SQL,Neo4j 具有 CQL 作为查询语言. Neo4j CQL Neo4j 图形数据库的查询语言: 一种声明性 ...
- Neo4j CQL高级
我们先准备脚本,创建数据,以便后续使用 // 删除所有的节点和关系 MATCH(n) OPTIONAL MATCH (n)-[r]-() DELETE n,r // 创建Person 的节点 CREA ...
- [Neo4j] CQL命令
文章目录 docker运行neo4j CQL create创建一个节点 match获取数据 RETURN子句 MATCH & RETURN匹配和返回 关系 where子句 delete子句 r ...
最新文章
- php代码中使用换行及(\n或\r\n和br)的应用
- 注释转换——(小项目)
- python3 pycharm 断点调试 报错 greenlet.error: cannot switch to a different thread
- 关于人工智能引擎的最初分析文档
- 使用了 23 年的 Java 不再免费!
- override和overload的区别
- Java正则表达式例子汇总
- Flask - 基础
- 更加方便地使用Markdown
- Signature字段
- Android 系统(44)---多语言
- 抖音播放量不到200,新手该如何自救?
- 计算机文档排版的心得体会,排版工作心得体会(共6篇) .docx
- unity (初学者的个人问题)
- 个人笔记使用(wolai,OneNote)
- css样式匹配苹果个型号手机
- 在虚拟机端搭建lamp和通过docker技术在云服务器搭建lamp环境
- 常见网站劫持案例及解析
- 用sqlcipher对已有的SQLite数据库加密
- ASP.NET中防止Access数据库下载
热门文章
- 教你微信对接图灵机器人
- MATLAB无线计算器
- JAVA POI报错:org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTRImpl.getXmlObjectArray
- VUI参数语义,色彩原色图表,高宽比标示符含义图表
- angularjs 猜大小
- Assignment | 05-week3 -Part_1-Neural Machine Translation
- 滑铁卢大学开发了一套AI工具,教泥瓦匠初学者搬砖诀窍
- 腾讯云GPU服务器深度学习环境搭建
- 【unity】遇到Multiple precompiled assemblies with the same name的解决方案
- 兰州理工大学计算机科学全国排名,兰州理工大学好吗,全国排名多少?