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);