文章目录

  • 简介
  • 基本组成
  • 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

查找相连节点

  1. 返回所有与’Oliver Stone’相连且label为Movie的节点。
  2. 返回与’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)

查找特定关系

  1. 查找通过ACTED_IN关系与’Wall Street’相连的节点名称。
  2. 查找通过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基础相关推荐

  1. Neo4j之CQL基础

    Neo4j之CQL基础 文章目录 Neo4j之CQL基础 一.CQL概念 二.CQL简介 三.CQL命令使用 create match+return where delete remove set o ...

  2. Neo4j CQL(附springboot集成neo4j)

    CQL代表Cypher查询语言. 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言. 常用的Neo4j CQL命令/条款如下: S.No. CQL命令/条 用法 1. CREA ...

  3. Neo4j - CQL简介

    CQL代表Cypher查询语言. 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言. Neo4j CQL - 它是Neo4j图形数据库的查询语言. 它是一种声明性模式匹配语言 ...

  4. Neo4j CQL - (3) -RETURN子句

    Neo4j CQL RETURN子句用于 - 检索节点的某些属性 检索节点的所有属性 检索节点和关联关系的某些属性 检索节点和关联关系的所有属性 RETURN命令语法: RETURN <node ...

  5. neo4j CQL使用

    neo4j CQL使用 Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言.像Oracle数据库具有查询 语言SQL,Neo4j具有CQL作为查询语言. 它是Neo4 ...

  6. Neo4j - CQL使用

    3.1 Neo4j - CQL简介 Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言.像Oracle数据库具有查询 语言SQL,Neo4j具有CQL作为查询语言. ...

  7. Neo4j CQL简介

    CQL CQL 代表 Cypher 查询语言.像 Orcale 数据库具有查询语言 SQL,Neo4j 具有 CQL 作为查询语言. Neo4j CQL Neo4j 图形数据库的查询语言: 一种声明性 ...

  8. Neo4j CQL高级

    我们先准备脚本,创建数据,以便后续使用 // 删除所有的节点和关系 MATCH(n) OPTIONAL MATCH (n)-[r]-() DELETE n,r // 创建Person 的节点 CREA ...

  9. [Neo4j] CQL命令

    文章目录 docker运行neo4j CQL create创建一个节点 match获取数据 RETURN子句 MATCH & RETURN匹配和返回 关系 where子句 delete子句 r ...

最新文章

  1. php代码中使用换行及(\n或\r\n和br)的应用
  2. 注释转换——(小项目)
  3. python3 pycharm 断点调试 报错 greenlet.error: cannot switch to a different thread
  4. 关于人工智能引擎的最初分析文档
  5. 使用了 23 年的 Java 不再免费!
  6. override和overload的区别
  7. Java正则表达式例子汇总
  8. Flask - 基础
  9. 更加方便地使用Markdown
  10. Signature字段
  11. Android 系统(44)---多语言
  12. 抖音播放量不到200,新手该如何自救?
  13. 计算机文档排版的心得体会,排版工作心得体会(共6篇) .docx
  14. unity (初学者的个人问题)
  15. 个人笔记使用(wolai,OneNote)
  16. css样式匹配苹果个型号手机
  17. 在虚拟机端搭建lamp和通过docker技术在云服务器搭建lamp环境
  18. 常见网站劫持案例及解析
  19. 用sqlcipher对已有的SQLite数据库加密
  20. ASP.NET中防止Access数据库下载

热门文章

  1. 教你微信对接图灵机器人
  2. MATLAB无线计算器
  3. JAVA POI报错:org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTRImpl.getXmlObjectArray
  4. VUI参数语义,色彩原色图表,高宽比标示符含义图表
  5. angularjs 猜大小
  6. Assignment | 05-week3 -Part_1-Neural Machine Translation
  7. 滑铁卢大学开发了一套AI工具,教泥瓦匠初学者搬砖诀窍
  8. 腾讯云GPU服务器深度学习环境搭建
  9. 【unity】遇到Multiple precompiled assemblies with the same name的解决方案
  10. 兰州理工大学计算机科学全国排名,兰州理工大学好吗,全国排名多少?