Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Neo4j的查询语法笔记(二)

Neo4j的查询语法笔记(二)

作者头像
我是攻城师
发布于 2018-05-14 08:53:48
发布于 2018-05-14 08:53:48
4.9K00
代码可运行
举报
文章被收录于专栏:我是攻城师我是攻城师
运行总次数:0
代码可运行

cypher是neo4j官网提供的声明式查询语言,非常强大,用它可以完成任意的图谱里面的查询过滤,我们知识图谱的一期项目 基本开发完毕,后面会陆续总结学习一下neo4j相关的知识。今天接着上篇文章来看下neo4j的cpyher查询的一些基本概念和语法。

一,Node语法

在cypher里面通过用一对小括号()表示一个节点,它在cypher里面查询形式如下:

1,() 代表匹配任意一个节点

2, (node1) 代表匹配任意一个节点,并给它起了一个别名

3, (:Lable) 代表查询一个类型的数据

4, (person:Lable) 代表查询一个类型的数据,并给它起了一个别名

5, (person:Lable {name:"小王"}) 查询某个类型下,节点属性满足某个值的数据

6, (person:Lable {name:"小王",age:23}) 节点的属性可以同时存在多个,是一个AND的关系

二,关系语法

关系用一对-组成,关系分有方向的进和出,如果是无方向就是进和出都查询

1,--> 指向一个节点

2,-[role]-> 给关系加个别名

3,-[:acted_in]-> 访问某一类关系

4,-[role:acted_in]-> 访问某一类关系,并加了别名

5,-[role:acted_in {roles:["neo","Hadoop"]}]->

访问某一类关系下的某个属性的关系的数据

三,模式语法

模式语法是节点和关系查询语法的结合,通过模式语法我们可以进行我们想要的任意复杂的查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(p1: Person:Actor {name:"tom"})-[role:acted_in {roles:["neo","actor"]}]-(m1:Movie {title:"water"})
四, 模式变量

为了增加模块化和减少重复,cypher允许把模式的结果指定在一个变量或者别名中,方便后续使用或操作

path = (: Person)-[:ACTED_IN]->(:Movie)

path是结果集的抽象封装,有多个函数可以直接从path里面提取数据如:

nodes(path):提取所有的节点

rels(path): 提取所有的关系 和relationships(path)相等

length(path): 获取路径长度

五,条件

cypher语句也是由多个关键词组成,像SQL的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name, count(*) from talbe where age=24 group by name having count(*) >2  order by count(*) desc

多个关键字组成的语法,cypher也非常类似,每个关键词会执行一个特定的task来处理数据

match: 查询的主要关键词

create: 类似sql里面的insert

filter,project,sort,page等都有对应的功能语句

通过组合上面的一些语句,我们可以写出非常强大复杂的语法,来查询我们想要检索的内容,cypher会 自动解析语法并优化执行。

一些实际的用法例子:

1,创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create (:Movie {title:"驴得水",released:2016})  return p;

执行成功,在neo4j的web页面我们能看到下面的信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------------+| No data returned. |
+-------------------+Nodes created: 1
Properties set: 2
Labels added: 1

当然cypher也可以一次创建多个数据,并同时添加关系

2,查询

match (p: Person) return p; 查询Person类型的所有数据

match (p: Person {name:"sun"}) return p; 查询名字等于sun的人

match( p1: Person {name:"sun"} )-[rel:friend]->(p2) return p2.name , p2.age 查询sun的朋友的名字和年龄

match (old) ... create (new) create (old)-[rel:dr]->(new) return new 对已经存在的节点和新建的节点建立关系

3,查询或更新

merge 语法可以对已经存在的节点不做改变,对变化的部分会合并

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MERGE (m:Movie { title:"Cloud Atlas" })ON CREATE SET m.released = 2012RETURN m

merge .... on create set ... return 语法支持合并更新

4,筛选过滤

cypher过滤也是用的和SQL一样的关键词where

match (p1: Person) where p1.name="sun" return p1;

等同下面的

match (p1: Person {name:"sun"}) return p1

注意where条件里面支持 and , or ,xor,not等boolean运算符,在json串里面都是and

除此之外,where里面查询还支持正则查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
match (p1: Person)-[r:friend]->(p2: Person) 
where p1.name=~"K.+" or p2.age=24 or "neo" in r.rels 
return p1,r,p2

关系过滤匹配使用not

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (p:Person)-[:ACTED_IN]->(m)WHERE NOT (p)-[:DIRECTED]->()RETURN p,m
5,结果集返回
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (p:Person)RETURN p, p.name AS name, upper(p.name), coalesce(p.nickname,"n/a") AS nickname, { name: p.name,  label:head(labels(p))} AS person

结果集返回做去重

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
match (n) return distinct n.name;
6,聚合函数

cypher支持count,sum,avg,min,max

match (: Person) return count(*)

聚合的时候null会被跳过 count 语法 支持 count( distinct role )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person)RETURN actor,director,count(*) AS collaborations
7,排序和分页
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (a:Person)-[:ACTED_IN]->(m:Movie)RETURN a,count(*) AS appearancesORDER BY appearances DESC SKIP 3 LIMIT 10;
8, 收集聚合结果
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (m:Movie)<-[:ACTED_IN]-(a:Person)
RETURN m.title AS movie, collect(a.name) AS cast, count(*) AS actors
9, union 联合

支持两个查询结构集一样的结果合并

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (actor:Person)-[r:ACTED_IN]->(movie:Movie)
RETURN actor.name AS name, type(r) AS acted_in, movie.title AS title
UNIONALLMATCH (director:Person)-[r:DIRECTED]->(movie:Movie)
RETURN director.name AS name, type(r) AS acted_in, movie.title AS title
10, with

with语句给cypher提供了强大的pipeline能力,可以一个或者query的输出,或者下一个query的输入 和return语句非常类似,唯一不同的是,with的每一个结果,必须使用别名标识。

通过这个功能,我们可以轻而易举的做到在查询结果里面在继续嵌套查询。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (person:Person)-[:ACTED_IN]->(m:Movie)
WITH person, count(*) AS appearances, collect(m.title) AS movies
WHERE appearances > 1RETURN person.name, appearances, movies

注意在SQL里面,我们想过滤聚合结果,需要使用having语句但是在cypher里面我们可以配合with语句使用 where关键词来完成过滤

11,添加约束或者索引

唯一约束(使用merge来实现) CREATE CONSTRAINT ON (movie:Movie) ASSERT movie.title IS UNIQUE

添加索引(在图谱遍历时,快速找到开始节点),大幅提高查询遍历性能 CREATE INDEX ON :Actor(name)

添加测试数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE (actor:Actor { name:"Tom Hanks" }),(movie:Movie { title:'Sleepless IN Seattle' }),
  (actor)-[:ACTED_IN]->(movie);

使用索引查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (actor:Actor { name: "Tom Hanks" })RETURN actor;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
neo4j官方开发文档阅读记录
neo-4j由两部分组成:relationship,label和property,label或者relationship中包含property,label与label之间形成关系.
DuncanZhou
2018/09/04
1.7K0
Neo4j常用查询语句
Cypher使用match子句查询数据,是Cypher最基本的查询子句。在查询数据时,使用Match子句指定搜索的模式,这是从Neo4j数据库查询数据的最主要的方法。match子句之后通常会跟着where子句,向模式中添加过滤性的谓词,用于对数据进行过滤。在查询数据时,查询语句分为多个部分,with子句用于对上一个查询部分的结果进行处理,以输出到下一个查询部分。
水煮麥楽雞
2022/11/20
2.7K0
Neo4j使用Cypher查询图形数据
原文出处:http://www.yund.tech/zdetail.html?type=1&id=e5a7ca6d4e801e88790cc85b94e1f405 作者:jstarseven  Neo
大道七哥
2019/08/23
2.7K0
Neo4j使用Cypher查询图形数据
快速初步了解Neo4j与使用
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Dream城堡
2018/09/10
1.8K0
快速初步了解Neo4j与使用
图数据库neo4j学习
在日常运维开发过程中,可能遇到需要存储或者展示依赖关系的情况,这种比较适合用图数据库去存储。
保持热爱奔赴山海
2025/03/26
1690
neo4j︱图数据库基本概念、操作罗列与整理(一)
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/79883503
悟乙己
2019/05/26
2.7K0
neo4j︱neo4j批量导入neo4j-import (五)
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/82424508
悟乙己
2019/05/26
3.8K0
图形数据库Neo4j基本了解
原文出处:http://www.yund.tech/zdetail.html?type=1&id=f519df57f29b22863d2a6a79326bd22b 作者:jstarseven  在深入
大道七哥
2019/08/23
3.1K0
图形数据库Neo4j基本了解
2018-11-19 如何将大规模数据导入Neo4j及导入具体步骤及Demo
博文原地址:https://my.oschina.net/zlb1992/blog/918243
Albert陈凯
2018/12/14
2.5K0
2018-11-19 如何将大规模数据导入Neo4j及导入具体步骤及Demo
Neo4j 之 Cypher 笔记
Cypher 是 Neo4j 提出的图查询语言,是一种声明式的图数据库查询语言,如同关系数据库中的 SQL,它拥有精简的语法和强大的表现力,能够精准且高效地对图数据进行查询和更新。
EmoryHuang
2022/10/31
1.4K0
NEO4J 图数据库哪里和哪里 从哪里开始
上期已经安装了图数据库,本期就该讨论到底这个图数据库里面的一些基本的概念和如何操作。最近听到一句话,年轻不年轻,不是看年龄,而是看你对新鲜事物的热情,即使你20岁,谈起新事物也是一脸的不屑,只能说明身体和灵魂分了家。闲话不谈 回归正题。
AustinDatabases
2020/05/09
3.2K0
关于neo4j图数据库笔记六-电影库和最短路径问题
知识图谱在工商企业、交往圈模型、系统架构、血缘关系、关联聚合场景、区域最短路径上都能发挥很大的作用,本笔记也只是简单的介绍了一下,介绍到此为止。
python与大数据分析
2022/03/11
8010
关于neo4j图数据库笔记六-电影库和最短路径问题
图数据库neo4j(二)python 连接neo4j
在完成安装之后,在python中调用py2neo即可,常用的有Graph,Node, Relationship。
学到老
2019/01/25
6.9K1
图数据库neo4j(二)python 连接neo4j
电影关系图谱
“电影关系图”实例将电影、电影导演、演员之间的复杂网状关系作为蓝本,使用Neo4j创建三者关系的图结构,虽然实例数据规模小但五脏俱全。
伊泽瑞尔
2022/06/01
1.5K0
电影关系图谱
一文速学-知识图谱从零开始构建实战:知识图谱搭建
“好事”文章推荐:BuildAdmin19:前端项目如何设计一个异步API请求模块
fanstuck
2024/11/26
6140
一文速学-知识图谱从零开始构建实战:知识图谱搭建
使用Neo4j和Java进行大数据分析 第1部分
几十年来,关系数据库一直主导着数据管理,但它们最近已经失去了NoSQL的替代品。虽然NoSQL数据存储不适合每个用例,但它们通常更适合大数据,这是处理大量数据的系统的简写。四种类型的数据存储用于大数据:
银河1号
2019/04/12
3.5K0
使用Neo4j和Java进行大数据分析 第1部分
解读Neo4j全新的Python驱动程序
尽管Neo4j社区目前已发布了Java、Python、JavaScript和.NET官方支持的驱动程序,但其发展并未停步。本周,Neo4j发布驱动程序py2neo 3.1版本,同时还为Python用户
CSDN技术头条
2018/02/12
1.6K0
解读Neo4j全新的Python驱动程序
Neo4j 系列(1) —— 初识 Neo4j
图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据
求和小熊猫
2021/12/06
3K0
neo4j import tool
Use the import tool 这篇教程提供了使用import tool的详细案例 当使用csv文件载入数据库时,为了能够创建节点之间的关系,每一个节点必须有一个独一无二的标识,节点ID。 关系通过连接两个节点之间的ID被创建,在下面的例子中,节点标识符作为属性存储在节点上。 节点标识符稍后可能对其他系统的交叉引用,可追溯性等感兴趣,但它们不是强制性的。 如果您不希望标识符在完成导入后保留,则不要在:ID字段中指定属性名称。
学到老
2019/01/25
7780
使用Neo4j和Java进行大数据分析 第2部分
本文的第一部分介绍了Neo4j及其Cypher查询语言。如果您已经阅读了第1部分,那么您已经了解了为什么Neo4j和其他图形数据库特别受社交图形或网络中用户之间关系建模的影响。您还在开发环境中安装了Neo4j,并概述了使用此数据存储的基本概念 - 即节点和关系。
银河1号
2019/04/12
5K1
相关推荐
neo4j官方开发文档阅读记录
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档