首页 » 技术分享 » Cypher基础

Cypher基础

 

Cypher

Cypher是图形数据库Neo4j的查询语言,就像SQL在关系型数据库中查询一样。

Like SQL, used in relational databases, Cypher is a textual declarative query language

本篇以官方示例以及一些小Demo记录Cypher的基本用法,需要详细资料可以前往官方文档学习。
https://neo4j.com/docs/developer-manual/3.4/cypher/

0 问题

  • Cypher基本增删查改
  • Cypher 怎么导入数据

1 基本CQL语句:

--创建节点
CREATE (p:Person { name:"Keanu Reeves", born:1964 })
--创建节点和关系
CREATE (p:Person{name:"kay"})-[:KNOWS]->(:Person{name:"Keanu Reeves"}) return p

--查询
match (p:Person) where p.name="kay" return p
--或者
match (p:Person{name:"kay"}) return p
--查询关系路径
match path=(p:Person{name:"kay"})-[:KNOWS]->(p:Person) return path

--修改
match (p:Person) where p.name="kay" set p.name="fen" return p

--删除
match (p:Person) where p.name="kay" delete p

--彻底删除(清空数据库,包括关系)
MATCH (n) DETACH DELETE n

以官方Movies 示例:
1.创建2个Person节点,一个Movie节点,建立关系,节点的属性以键值对的形式存储 {key:value}

CREATE (a:Person { name:"Tom Hanks",
  born:1956 })-[r:ACTED_IN { roles: ["Forrest"]}]->(m:Movie { title:"Forrest Gump",released:1994 })
CREATE (d:Person { name:"Robert Zemeckis", born:1951 })-[:DIRECTED]->(m)
RETURN a,d,r,m

得到如下关系:

alt

查询:

--查询
MATCH (nineties:Movie) WHERE nineties.released >= 1990 AND nineties.released < 2000 RETURN nineties.title

--查询 Tom Hanks 演过的所有电影
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies


--谁导演了 Forrest Gump
MATCH (movie {title: "Forrest Gump"})<-[:DIRECTED]-(directors) RETURN directors.name

--Tom Hanks' co-actors...
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name

--How people are related to "Forrest Gump"...
MATCH (people:Person)-[relatedTo]-(:Movie {title: "Forrest Gump"}) RETURN people.name, Type(relatedTo), relatedTo

2 Match

Match 类似与SQL中的Select ,用来匹配一种搜索模式

以官网下图说明:

alt

2.1 查询所有节点

MATCH (n)
RETURN n

2.2 查询所有电影 Movie 标签

MATCH (movie:Movie)
RETURN movie.title

:Movie 之前 的 movie 称为临时变量,代表符合条件的一个结果,可以取任何名称

3 Merge

使用Create关键字创建节点和关系的时候不能避免重复,每次都是新建,即使该数据已经存在数据库中,对此可以使用Merge关键字,Merge类似于Match + Create ,如果存在就直接使用,不存在则创建。

3.1 Query.

MERGE (robert:Critic)
RETURN robert, labels(robert)

如果 :Critic 标签的记录存在则返回,不存在则创建一个新的节点

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

如果 keanu 不存在则创建它并添加一个created属性为当前时间戳

3.2 Merge with ON MATCH
MERGE (person:Person)
ON MATCH SET person.found = TRUE RETURN person.name, person.found

找到所有的Person节点,并设置属性(如果不存在不创建新节点)

3.3 Merge with ON CREATE and 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

创建keanu节点,并设置created属性。如果keanu已经存在,则设置lastSeen属性。这里其实是2种情况。

4 UNWIND

  • 将列表转换为单独的行进行操作。
-- 列表去重
WITH [1, 1, 2, 2] AS coll
UNWIND coll AS x
WITH DISTINCT x
RETURN collect(x) AS setOfVals
  • 拼接列表:
-- 连接2个列表然后输出
WITH [1, 2] AS a,[3, 4] AS b
UNWIND (a + b) AS x
RETURN x
  • 将嵌套的list平铺:
WITH [[1, 2],[3, 4], 5] AS nested
UNWIND nested AS x
UNWIND x AS y
RETURN 
-- 输出 y:1 2 3 4 5
  • UNWIND如果作用于空列表则没有返回值,为了避免无意识的对空集合进行UNWID,可以使用case来判断:
WITH [] AS list
UNWIND
   CASE
      WHEN list = []
         THEN [null]
      ELSE list
   END AS emptylist
RETURN emptylist
  • 可以代替FOREACH操作传入的list参数
UNWIND $events AS event
MERGE (y:Year { year: event.year })
MERGE (y)<-[:IN]-(e:Event { id: event.id })
RETURN e.id AS x
ORDER BY x

5 Cypher 导入CSV数据

导入Person数据,新建Person节点:

LOAD CSV WITH HEADERS FROM "https://neo4j.com/docs/developer-manual/3.4/csv/import/persons.csv" AS csvLine
CREATE (p:Person { id: toInteger(csvLine.id), name: csvLine.name })

person.csv格式如下:

id,name
1,Charlie Sheen
2,Oliver Stone
3,Michael Douglas
4,Martin Sheen
5,Morgan Freeman

如此便导入5个Person节点,Person { id,name },属性有id和name

转载自原文链接, 如需删除请联系管理员。

原文链接:Cypher基础,转载请注明来源!

0