Neo4j使用Cypher查询图形数据

Stella981
• 阅读 681

原文出处http://www.yund.tech/zdetail.html?type=1&id=e5a7ca6d4e801e88790cc85b94e1f405    

作者:jstarseven 


Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言的事实上的标准。本文作为入门级的教程,我不会试图分析Cypher语言的全部内容,本文的目标是循序渐进地使用Cypher语言执行简单的CRUD操作,为了便于演示,本文在Neo4j Browser中执行Cypher示例代码。以下图形包含三个节点和两个关系,本文会一步一步讲解如何利用Cypher语言创建以下图形。

Neo4j使用Cypher查询图形数据

一,easy,热热身

和SQL很相似,Cypher语言的关键字不区分大小写,但是属性值,标签,关系类型和变量是区分大小写的。

1,变量(Variable)

变量用于对搜索模式的部分进行命名,并在同一个查询中引用,在小括号()中命名变量,变量名是区分大小写的,示例代码创建了两个变量:n和b,通过return子句返回变量b;

MATCH (n)-->(b)
RETURN b

在Cypher查询中,变量用于引用搜索模式(Pattern),但是变量不是必需的,如果不需要引用,那么可以忽略变量。

2,访问属性

在Cypher查询中,通过逗号来访问属性,格式是:Variable.PropertyKey,通过id函数来访问实体的ID,格式是id(Variable)。

match (n)-->(b)
where id(n)=5 and b.age=18
return b;

二,创建节点

节点模式的构成:(Variable:Lable1:Lable2{Key1:Value1,Key2,Value2}),实际上,每个节点都有一个整数ID,在创建新的节点时,Neo4j自动为节点设置ID值,在整个数据库中,节点的ID值是递增的和唯一的。

下面的Cypher查询创建一个节点,标签是Person,具有两个属性name和born,通过RETURN子句,返回新建的节点:

create (n:Person { name: 'Tom Hanks', born: 1956 }) return n;

Neo4j使用Cypher查询图形数据

继续创建其他节点:

create (n:Person { name: 'Robert Zemeckis', born: 1951 }) return n;
create (n:Movie { title: 'Forrest Gump', released: 1951 }) return n;

三,查询节点

通过match子句查询数据库,match子句用于指定搜索的模式(Pattern),where子句为match模式增加谓词(Predicate),用于对Pattern进行约束;

1,查询整个图形数据库

match(n) return n;

在图形数据库中,有三个节点,Person标签有连个节点,Movie有1个节点

Neo4j使用Cypher查询图形数据

点击节点,查看节点的属性,如图,Neo4j自动为节点设置ID值,本例中,Forrest Gump节点的ID值是5,

Neo4j使用Cypher查询图形数据

2,查询born属性小于1955的节点

match(n) 
where n.born<1955 
return n;

Neo4j使用Cypher查询图形数据

3,查询具有指定Lable的节点

match(n:Movie) 
return n;

Neo4j使用Cypher查询图形数据

4,查询具有指定属性的节点

match(n{name:'Tom Hanks'}) 
return n;

Neo4j使用Cypher查询图形数据

四,创建关系

关系的构成:StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在创建关系时,必须指定关系类型。

1,创建没有任何属性的关系

MATCH (a:Person),(b:Movie)
WHERE a.name = 'Robert Zemeckis' AND b.title = 'Forrest Gump'
CREATE (a)-[r:DIRECTED]->(b)
RETURN r;

Neo4j使用Cypher查询图形数据

2,创建关系,并设置关系的属性

MATCH (a:Person),(b:Movie)
WHERE a.name = 'Tom Hanks' AND b.title = 'Forrest Gump'
CREATE (a)-[r:ACTED_IN { roles:['Forrest'] }]->(b)
RETURN r;

Neo4j使用Cypher查询图形数据

五,查询关系

在Cypher中,关系分为三种:符号“--”,表示有关系,忽略关系的类型和方向;符号“-->”和“<--”,表示有方向的关系;

1,查询整个数据图形

Neo4j使用Cypher查询图形数据

2,查询跟指定节点有关系的节点

示例脚本返回跟Movie标签有关系的所有节点

match(n)--(m:Movie) 
return n;

Neo4j使用Cypher查询图形数据

2,查询有向关系的节点

MATCH (:Person { name: 'Tom Hanks' })-->(movie)
RETURN movie;

Neo4j使用Cypher查询图形数据

3,为关系命名,通过[r]为关系定义一个变量名,通过函数type获取关系的类型

MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie)
RETURN r,type(r);

Neo4j使用Cypher查询图形数据

4,查询特定的关系类型,通过[Variable:RelationshipType{Key:Value}]指定关系的类型和属性

MATCH (:Person { name: 'Tom Hanks' })-[r:ACTED_IN{roles:'Forrest'}]->(movie)
RETURN r,type(r);

Neo4j使用Cypher查询图形数据

六,更新图形

set子句,用于对更新节点的标签和实体的属性;remove子句用于移除实体的属性和节点的标签;

1,创建一个完整的Path

由于Path是由节点和关系构成的,当路径中的关系或节点不存在时,Neo4j会自动创建;

CREATE p =(vic:Worker:Person{ name:'vic',title:"Developer" })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael:Worker:Person { name: 'Michael',title:"Manager" })
RETURN p

变量neo代表的节点没有任何属性,但是,其有一个ID值,通过ID值为该节点设置属性和标签

Neo4j使用Cypher查询图形数据

2,为节点增加属性

通过节点的ID获取节点,Neo4j推荐通过where子句和ID函数来实现。

match (n)
where id(n)=7
set n.name = 'neo'
return n;

3,为节点增加标签

match (n)
where id(n)=7
set n:Company
return n;

Neo4j使用Cypher查询图形数据

4,为关系增加属性

match (n)<-[r]-(m)
where id(n)=7 and id(m)=8
set r.team='Azure'
return n;

Neo4j使用Cypher查询图形数据

七,Merge子句

Merge子句的作用有两个:当模式(Pattern)存在时,匹配该模式;当模式不存在时,创建新的模式,功能是match子句和create的组合。在merge子句之后,可以显式指定on creae和on match子句,用于修改绑定的节点或关系的属性。

通过merge子句,你可以指定图形中必须存在一个节点,该节点必须具有特定的标签,属性等,如果不存在,那么merge子句将创建相应的节点。

1,通过merge子句匹配搜索模式

匹配模式是:一个节点有Person标签,并且具有name属性;如果数据库不存在该模式,那么创建新的节点;如果存在该模式,那么绑定该节点;

MERGE (michael:Person { name: 'Michael Douglas' })
RETURN michael;

2,在merge子句中指定on create子句

如果需要创建节点,那么执行on create子句,修改节点的属性;

ERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
RETURN keanu.name, keanu.created

3,在merge子句中指定on match子句

如果节点已经存在于数据库中,那么执行on match子句,修改节点的属性;

MERGE (person:Person)
ON MATCH SET person.found = TRUE , person.lastAccessed = timestamp()
RETURN person.name, person.found, person.lastAccessed

4,在merge子句中同时指定on create 和 on match子句

MERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
ON MATCH SET keanu.lastSeen = timestamp()
RETURN keanu.name, keanu.created, keanu.lastSeen

5,merge子句用于match或create一个关系

MATCH (charlie:Person { name: 'Charlie Sheen' }),(wallStreet:Movie { title: 'Wall Street' })
MERGE (charlie)-[r:ACTED_IN]->(wallStreet)
RETURN charlie.name, type(r), wallStreet.title

6,merge子句用于match或create多个关系

MATCH (oliver:Person { name: 'Oliver Stone' }),(reiner:Person { name: 'Rob Reiner' })
MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)
RETURN movie

7,merge子句用于子查询

Neo4j使用Cypher查询图形数据

MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
RETURN person.name, person.bornIn, city;

MATCH (person:Person)
MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.chauffeurName })
RETURN person.name, person.chauffeurName, chauffeur;

MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
MERGE (person)-[r:BORN_IN]->(city)
RETURN person.name, person.bornIn, city;

Neo4j使用Cypher查询图形数据

八,跟实体相关的函数

1,通过id函数,返回节点或关系的ID

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN id(r);

2,通过type函数,查询关系的类型

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN type(r);

3,通过lables函数,查询节点的标签

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN lables(movie);

4,通过keys函数,查看节点或关系的属性键

MATCH (a)
WHERE a.name = 'Alice'
RETURN keys(a)

5,通过properties()函数,查看节点或关系的属性

CREATE (p:Person { name: 'Stefan', city: 'Berlin' })
RETURN properties(p)

 -END-

Neo4j使用Cypher查询图形数据

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这