neo4j︱Cypher 查询语言简单案例(二)

图数据库常规的有:neo4j(支持超多语言)、JanusGraph/Titan(分布式)、Orientdb,google也开源了图数据库Cayley(Go语言构成)、PostgreSQL存储RDF格式数据。

—- 目前的几篇相关:—–
neo4j︱图数据库基本概念、操作罗列与整理(一)
neo4j︱Cypher 查询语言简单案例(二)
neo4j︱Cypher完整案例csv导入、关系联通、高级查询(三)

neo4j系列第二篇,一个简单的demo案例,从构建-基本内容查询。

这里写图片描述


一、三要素:节点、关系、模式

1.1 节点

基本用法:

MATCH (node:Label) RETURN node.property

MATCH (node1:Label1)-->(node2:Label2)
WHERE node1.propertyA = {value}
RETURN node2.propertyA, node2.propertyB

我们通常用圆括号来包含节点标示符(当然也可以不用)。里面的内容也叫变量,变量不是单指某一个节点,而是服从条件的节点组合。如(p: Person),如果想添加属性:(p: Person {name: “yinglish”})。 注意:节点标签、关系类型和属性名称区分大小写。
其中节点之间用:’–>’,包含关系的可以用’->’

1.2 关系

有以下几种关系型写法:

-[rel:KNOWS]-> //单关系,关系的变量名为rel,类型是 KNOWS
(a)-[:KNOWS|:LIKE]->(b) //查询a到b的两类关系
-[{since:2010}]-> //附加属性
-[:KNOWS*..4]-> example: a -[rel: type*minHop..maxHop]-> b  
//从a节点到b节点最少可经过minHop、最大可经过maxHop个节点

关系表达,cypher语法:
此处输入图片的描述

举例:

MATCH (n1:Label1)-[rel:TYPE]->(n2:Label2)
WHERE rel.property > {value}
RETURN rel.property, type(rel)

1.3 模式 Patterns

其功能为:Patterns can be used to MATCH and CREATE data, but also (evaluating to a list of paths) in expressions, predicates and results.
patterns 模式由一个或多个路径组成,路径间用逗号分隔,一条路径就是一个节点和关系的序列,这个序列指定开始和结束节点,如:(a) –> (b),这条路径开始于a,通过outgoing关系指向b。如果你不在乎具体是哪个节点,不用指定它,只需要用空括号来表示就可以了,如:a –>()–>b。模式是cypher中的关键部分,灵活书写模式能帮我们正确获取、实现推测计算等等各种任务。

  • friend-of-a-friend (user)-[:KNOWS]-(friend)-[:KNOWS]-(foaf)
  • shortest path: path = shortestPath( (user)-[:KNOWS*..5]-(other) )
  • collaborative filtering
    (user)-[:PURCHASED]->(product)<-[:PURCHASED]-()-[:PURCHASED]->(otherProduct)
  • tree navigation
    (root)<-[:PARENT*]-(leaf:Category)-[:ITEM]->(data:Product)

比较费解…

.


二、使用案例demo

从0开始构建一个非常小的关系网络结构,来简单应用cypher语言。
来源:GraphGist: First Steps with Cypher by Michael Hunger

1、创建自己’You’的节点

CREATE (you:Person {name:"You"})
RETURN you

这里写图片描述

2、创建与自己关系的节点

MATCH (you:Person {name:"You"})
CREATE (you)-[like:LIKE]->(neo:Database {name:"Neo4j" })
RETURN you,like,neo

这里写图片描述

match到’You’节点之后,新建一条关系,是’You’-‘like’-‘neo4j’。
当create之后,return之后,就会返回三个实体,2个节点+1条关系。
match中,变量-变量,可以用’–>’,关系型的指向用’->’

3、批量创建与自己有关的朋友

MATCH (you:Person {name:"You"})
FOREACH (name in ["Johan","Rajesh","Anna","Julia","Andrew"] |
 CREATE (you)-[:FRIEND]->(:Person {name:name}))

这里写图片描述

其中,foreach表示循环,反复create。再来看一个foreach的案例(from:3.3.15. FOREACH):

MATCH p =(begin)-[*]->(END )
WHERE begin.name = 'A' AND END .name = 'D'
FOREACH (n IN nodes(p)| SET n.marked = TRUE )

4、查询你的朋友圈

match (you {name:'You'})-[:FRIEND]->(yf)
return you,yf

这里写图片描述

通过关系查询’You’的朋友圈

5、新建朋友圈之外的二度关系

match (neo:Database {name : 'Neo4j'})
create (anna:Person {name:'Anna'})-[:FRIEND]->(ama:Person:Expert {name:'Amanda'})-[:WORKED_WITH]->(neo)
return neo,anna,ama

这里写图片描述
创建了’Anna’-‘Amanda’的朋友关系,创建了’Amanda’-‘neo’的工作关系。
同时,定义了’Amanda’的’Expert’身份。

6、查询:我通过朋友圈的谁来学习neo4j

match (you:Person {name:"You"}) 
match (expert)-[:WORKED_WITH]->(neo:Database {name:'Neo4j'})
match path = shortestPath((you)-[:FRIEND*..5]-(expert))
return path,you,expert,neo

这里写图片描述

先定位自己you,然后去寻找朋友中谁懂Neo4j:person->neo,然后寻找最短路径的:you-person即可达到目的。
不能用you直接关联neo,而是通过朋友,二度跳转到neo4j。
此时的(expert)->(neo)值得新手去理解一下,这里expert不是单独指定到某个人,而是指代所有WORKED_WITH neo的人。


参考文献:

Intro to Cypher
GraphGist: First Steps with Cypher

我的neo4j学习笔记

公众号“素质云笔记”定期更新博客内容:

这里写图片描述

### Neo4j Cypher 查询语言使用教程 #### 一、基本概念介绍 Cypher 是一种声明式的图形查询语言,用于高效地查询更新图数据库中的数据。通过简洁而强大的语法结构,能够轻松表达复杂的模式匹配需求[^1]。 #### 、环境准备 对于希望在本地环境中实践 Cypher 的用户来说,安装 Neo4j Desktop 并创建一个新的项目是一个不错的选择。当涉及到导入外部 CSV 文件时,则需按照指定路径放置这些文件以便后续处理[^3]。 #### 三、简单查询实例 为了更好地理解如何利用 Cypher 进行关系型数据的操作,下面给出几个基础的例子: - **查找所有节点** 要获取存储于图谱内的全部实体记录,可执行如下命令: ```cypher MATCH (n) RETURN n; ``` - **按标签筛选节点** 如果只关心带有特定标记的对象集合,那么可以通过添加 `:` 后跟相应名称来限定范围: ```cypher MATCH (p:Person) RETURN p.name, p.age; ``` - **定位具有给定属性值的边** 当目标锁定为连接两个顶点之间的关联,并且该关联拥有某些特征参数时,采用此方式能精准命中所需对象: ```cypher MATCH ()-[r:FRIEND]->() WHERE r.since = '2021' RETURN r; ``` 上述例子展示了不同场景下的常用法,其中第三个案例特别适用于寻找满足条件的关系实例[^2]。 #### 四、高级特性概览 除了以上提到的基础功能外,Cypher 还支持诸如聚合函数、子查询嵌套等多种复杂逻辑运算;同时也允许开发者定义变量以简化重复使用的表达式片段。随着技能水平提升,探索更多可能性将变得十分有趣!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟乙己

兄弟,牛啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值