Neo4j

#DataBase #NoSQL #Neo4j

Graph

  • 节点(事物)和边(关系)的集合,其中边为节点对的连接
    • 适用于任何相关数据
  • 可在节点和关系上附加属性(键值对)与关系
  • 关系连接两个节点,节点和关系都可以保存为任意数量的键值对

What is Neo4j ?

  • Neo4j 是一个高度可扩展的原生图数据库,不仅可以利用数据,还可以利用数据之间的关系。
  • 图形(即网络)是处理数据的最高效、最直观的方式,它模仿了人类头脑中思想的相互联系。Neo4j 从底层开始构建,旨在利用图形的力量来实时洞察底线。
  • 它采用直观的适应性数据建模技术。
  • 使用图形查询语言 Cypher
  • Neo4j是一个数据库
    • 用它来可靠地存储信息并在以后查找它
    • Neo4j的数据模型是图,尤其是属性图

Quick Start Only For MacOS

Installation

  • 安装 Neo4J (此处采用 homebrew 包管理器进行安装)
brew install neo4j

Start

  1. MacOS 后台启动 Neo4j
brew services start neo4j
  1. 命令行启动 Neo4j
cypher-shell
  1. 输入用户名密码
用户名 密码
neo4j neo4j

Stop

  1. 退出命令行
:exit
  1. 关闭 MacOS后台服务
brew services stop neo4j

What is Cypher ?

Cypher 是一种声明式图形查询语言,可以对图形存储进行高效的查询和更新。

  • Cypher 借鉴了 SQL 的结构,使用各种子句建立查询。
  • Cypher是Neo4j的图形查询语言(图的SQL!)
  • Cypher 是一种声明式查询语言:它描述的是你感兴趣的内容,而不是如何获取这些内容。
  • Cypher 具有很强的可读性和表现力

Basic Structure

  • Node 节点
  • Relationship 关系
  • Property 属性
  • Label 标签

Node

  • Cypher 使用一对括号(通常包含一个文本字符串),如 (), (foo) 来表示一个节点
  • 最简单的形式是(),表示一个匿名的、未表征的节点。
  • 引用其他地方的节点,添加一个变量:(matrix)
  • Movie 标签(前缀为冒号)说明了节点的类型或作用。
  • 属性可用于存储信息和/或限制模式。例如,我们可以 MATCH 和 RETURN 标题为 "The Matrix "的节点。

Label

  • 标签允许我们对节点进行分组
  • Cypher 使用标签来更好地决定如何优化查询
MATCH (node:Label) RETURN node
MATCH(node1:Label) -[:REL_TYPE]-> (node2:Label) RETURN node1, node2

Relationship

  • 关系是一个节点指向另一个节点的箭头,就像 -> 或 <- 。但我们可以根据需要在一对方括号中添加有关它们的细节。
MATCH(node1:Label) -[:REL_TYPE]-> (node2:Label) RETURN node1, node2
MATCH(node1:Label) -[REL:TYPE]-> (node2:Label) RETURN rel.property

Query

Create Node

CREATE(node: Label {key:value, ...})
CREATE (n:Person {name: 'Allen', age: 20})

Modify Property

MATCH (n:Label {key:value})	
SET n.key = value

Add Relationship

MATCH (n1:Label {key:value}), (n2:Label {key:value})	
CREATE (n1)-[r:RELATIONSHIP]->(n2)

Delete Relationship

MATCH (n:Label {key:value})	
REMOVE n.key

Delete Node

  • DELETE Node
MATCH (n:Label {key:value})	
DELETE n
  • DELETE Node and Relationship
MATCH (node {Property:Value})  
DETACH DELETE node
MATCH (a:Label {Property: value}) 
OPTIONAL MATCH (a)-[r]-()				 
DELETE a, r

MATCH会返回空
OPTIONAL MATCH 即使没有匹配到也会返回 NULL

Sort, Limit, Skip

ORDER BY

  • 在 Cypher 中,使用 ORDER BY 命令很容易对结果进行排序。
  • 比方说,我们想显示数据库中年龄最大的人。我们可以使用下面的查询:
MATCH (person:Person)
RETURN person.name, person.born
ORDER BY person.born
  • 也可以使用 DESC 关键字来指定降序排序:
MATCH (person:Person)	
RETURN person.name, person.born	
ORDER BY person.born DESC
  • 升序
MATCH (person:Person)
RETURN person.name, person.born	
ORDER BY person.born ASC

LIMIT and SKIP

  • Cypher 支持对记录集进行简便的分页。
  • 它使用 LIMIT 和 SKIP 语句来减少返回记录的数量,并允许对结果进行分页。
  • LIMIT: 限制返回的记录数
  • SKIP: 跳过指定数量的记录
MATCH (person:Person)	
RETURN person.name, person.born		
ORDER BY person.born DESC
SKIP 10 LIMIT 5	

SKIP 10 LIMIT 5

  • 从第 10 条记录开始,返回 5 条记录

DISTINCT

  • 通常,我们要求查询只返回不同的结果
MATCH (person:Person)	
RETURN DISTINCT person.born

路径模式

  • 选中的节点与边组成的字符串

  • 起点和终点都是节点

  • 查找图中与Gene Hackman合作过的演员

MATCH (gene:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(other:Person)
WHERE gene.name="Gene Hackman"
RETURN distinct other
  • 查找所有电影相关演职人员的三种写法
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person)
RETURN actor.name, movie.title, director.name;
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie),
      (movie)<-[:DIRECTED]-(director:Person)
RETURN actor.name, movie.title, director.name;
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie),(director:Person)-[:DIRECTED]->(movie)

RETURN actor.name, movie.title, director.name;

变量路径模式

  • 跨越任何深度的关系是: (a)-[*]->(b)

  • 特定深度关系的表示方法是:(a)-[*深度]->(b),以查找所有深度步长的路径。

  • 1到4层深度的关系是这样表示的: (a)-[*1..4]->(b)

  • 距离 3 层的 KNOWS 类型关系:(a)-[:KNOWS*3]->(b)

  • 2 层 KNOWS 或 LIKES 类型的关系:(a)-[:KNOWS|:LIKES*2...]->(b)

MATCH p =(actor { name: 'Tom Hanks' })-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)

最短路径

  • 最短路径是两个节点之间的最短路径。
MATCH
	(tom:Person { name: 'Tom Hanks' }),
	(kevin:Person { name: 'Kevin Bacon' }), 
	p = shortestPath((tom)-[*..15]-(kevin))
RETURN p

Index 索引

  • Neo4j 不使用索引来加速 JOIN 操作

  • 有助于通过值、前缀或范围查找起点

  • 创建特定于标签的索引,因为索引绑定到具体的标签-属性组合上

  • 示例:根据电影标题有效搜索

CREATE INDEX ON :Movie(title)
  • 要删除索引,请使用以下 Cypher 命令
DROP INDEX ON :Movie(title)

创建特定标签的索引

  • 在标有 "人 "的节点上创建索引,按属性名称建立索引:
CREATE INDEX ON :Person(name)

汇总

  • COUNT(x)
  • MIN(x)
  • MAX(x)
  • AVG(x)
  • SUM(x)
  • COLLECT(x)
MATCH (person:Person)-[:ACTED_IN]->(movie:Movie)
RETURN person.name, collect(movie.title)

LOAD CSV

  • LOAD CSV 语句可将本地或远程文件解析为表示映射(带标题)或列表的一系列行。
  • 使用任何 Cypher 操作来创建节点或关系,或与现有图结构合并
  • 由于 CSV 文件通常表示节点或关系列表,因此需要执行多次操作,分别创建节点和关系。
  • 示例,查询使用 movies.csv 中的数据作为属性创建电影节点
LOAD CSV WITH HEADERS 
FROM "" AS line 
CREATE (:Movie {id: line.id, title: line.title, released: toINT(line.year)})