neo4j 图数据库:Cypher语法基础

neo4j的基本介绍,作用什么的就不多解释了,直接上干货。

节点(Nodes)

Cypher使用()来表示一个节点。

() #最简单的节点形式,表示一个任意无特征的节点,其实就是一个空节点
(matrix) #如果想指向一个节点在其他地方,我们可以给节点添加一个变量名(matrix)。变量名被限制单一的语句里,一个变量名在不同的语句中可能有不同的意义,或者没意义
(:Movie) #添加标签名称
(matrix:Movie) #一个节点有一个标签名(Movie),并且把它分配到变量matrix上 
               #节点的标签(被定义在:后),用于声明节点的类型或者角色。注意节点可以有多个标签。标签被用于 限制搜索pattern, 保留他们在匹配结构中,不使用标签在query里。
(matrix:Movie {title: "The Matrix"}) #花括号里定义节点的属性,属性都是键值对
(matrix:Movie {title: "The Matrix", released: 1999}) #多个属性
(matrix:Movie:Promoted) #多个标签

属性可以用来存储信息或者来条件匹配(查找)
创建一个节点:

CREATE (matrix:Movie {tagline:"Welcome to the Real World",title:"The Matrix",released:"1999"})

例如:

MATCH (movie:Movie {title:"The Matrix"})
RETURN movie
返还结果

标签(Labels)

标签可以将节点进行分组。例如:

MATCH (node:Label) RETURN node

MATCH (node1:Label1)-[:REL_TYPE]->(node2:Label2)
RETURN node1, node2 #这是pattern

关系(Relationships)

两个节点之间会有关系,添加前后相关信息在数据中。我们想能够看到一个人与电影的关系,可能是演员,可能是导演,也可能是,制作人等等。简单的来说我们需要能够描述一种关系种类在我们的Cypher query中。
首先,关系是箭头指向一个节点到另一个节点,像是--> 或 <--。但是我们可以添加一些详细信息关于这些关系,可以在一对中括号里。
如果我们想要检索每一个人谁演过某一个电影,我们要描述一个pattern
(actor:Person)-[:ACTED_IN]->(movie:Movie) 来找回只有当节点有这一关系类型(ACTED_IN)与另一个节点的时候。

或者更一般地:

MATCH (node1)-[:REL_TYPE]->(node2)

有些时候,我们需要访问一些关于关系的信息(如:关系的类型,关系的属性),例如我们有可能想要输出角色,关于某一个演员演的某一部电影。
和节点差不多,我们也可以使用关系的变量 (在:TYPE 前)。如果我们试图去匹配 (actor)-[rel:ACTED_IN]->(movie) 我们能够输出 rel.roles, 对于每个演员在所有电影里所饰演的角色。

MATCH (actor:Person)-[rel:ACTED_IN]->(movie:Movie)
RETURN rel.roles

或者更一般的写:

MATCH (node1)-[rel:TYPE]->(node2)
RETURN rel.property

模式(Patterns)

结合语法于节点和关系,我们可以写模式了。下面是一个简单的模式:

MATCH (matrix:Movie {title:"The Matrix"} )<-[role:ACTED_IN {roles:["Neo"]}]-(keanu:Person {name:"Keanu Reeves"})
RETURN matrix, role, keanu

图展示:



文字展示:

文字
添加一些属性

创建电影 Mystic River

CREATE (movie:Movie {title: "Mystic River", released:1993}) 

找到演员 Kevin Bacon 和电影 Mystic River,添加关系 ACTED_IN

MATCH (kevin:Person) WHERE kevin.name = "Kevin Bacon"
MATCH (mystic:Movie) WHERE mystic.title = "Mystic River"
CREATE (kevin)-[r:ACTED_IN {roles:["Sean"]}]->(mystic)
RETURN mystic,r, kevin

假如现在我们想给电影节点加一个标语 tagline。首先我们不得不再次找到这一电影,然后 SET 一个 tagline 属性。query 如下:

MATCH (movie:Movie)
WHERE movie.title = "Mystic River"
SET movie.tagline = "We bury our sins here, Dave. We wash them clean."
RETURN movie.title AS title, movie.tagline AS tagline

注意:由于 Neo4j 是 schema-free 的,因此你可以添加任意的属性到节点或者关系上。

更新属性

电影 Mystic River 是在2003年发布的而非1993,所以 query 如下:

MATCH (movie:Movie)
WHERE movie.title = "Mystic River"
SET movie.released = 2003
RETURN movie.title AS title, movie.released AS released

添加和更新属性的语法是一样的。

删除节点和关系

第一步:用 MATCH 语句找到节点,
第二步:OPTIONAL MATCH, 是用于找到节点匹配模式。如果没匹配则返还一行,值为 null,也可能返还多行信息。也可以用 WHERE 语句来过滤。
第三步:用DELETE语句来删除
这是一个标准的 DETACH, DELETE 任务,删除节点和关系。

MATCH (emil:Person {name:"Emil Eifrem"})
OPTIONAL MATCH (emil)-[r]-()
DELETE emil,r
返回所有节点 query
MATCH (n)
RETURN n
删除所有节点 query
MATCH (n) #我们想匹配所有的节点,并且给他们一个名字n
DETACH DELETE n
导入数据

如果想导入CSV文件,你需要创建一个模型来描述数据是如何从你的CSV文件映射到你的图中的。

导入标准化的数据通过 LOAD CSV

Cypher 提供简洁的内建方法来导入CSV数据到图结构里。
LOAD CSV 解析一个本地或远程文件到所有行的一个 stream,这表示lists。然后可以创建新的节点或者关系,又或者在已有的图结构上继续添加。
举个栗子:
movie.csv 文件

id,title,country,year
1,Wall Street,USA,1987
2,The American President,USA,1995
3,The Shawshank Redemption,USA,1994

创建 movie 节点:

LOAD CSV WITH HEADERS
FROM "http://neo4j.com/docs/stable/csv/intro/movies.csv"
AS line
CREATE (movie:Movie { id:line.id, title:line.title, released:toInt(line.year) });

persons.csv 文件

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

为了避免创建同样的节点,我们可以用 MERGE 来替代 CREATE,同时使用 MERGE 时,要用对应的 ON CREATE 或者 ON MATCH,这样就允许 query 表达其他的改变,对于一个节点或者关系的属性,根据某一元素在数据库中是不是被匹配到过或者创建过。

LOAD CSV WITH HEADERS
FROM "http://neo4j.com/docs/stable/csv/intro/persons.csv"
AS line
MERGE (actor:Person { id:line.id })
ON CREATE SET actor.name=line.name;

roles.csv 文件(保存节点之间的关系)

personId,movieId,role
1,1,Bud Fox
4,1,Carl Fox
3,1,Gordon Gekko
4,2,A.J. MacInerney
3,2,President Andrew Shepherd
5,3,Ellis Boyd 'Red' Redding

下面的 query 匹配 line.personId 和 line.movieId 的实体分别地到 :Movie 和 :Person 的节点通过他们的键 “propertyId”, 然后创建 ACTED_IN 关系在人和电影之间。

LOAD CSV WITH HEADERS
FROM "http://neo4j.com/docs/stable/csv/intro/roles.csv"
AS line
MATCH (movie:Movie { id:line.movieId })
MATCH (person:Person { id:line.personId })
CREATE (person)-[:ACTED_IN { roles: [line.role]}]->(movie);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容