项目地址Neo4j官网
基础
节点,关系,标签,特性
节点和关系是图数据库的基本组成单元
节点(Nodes)
节点表示实体(entities).与关系型数据库进行对比,可得:
图数据库 | 关系型数据库 |
---|---|
节点 | 行 |
节点在Cypher语句中用
(p:Person)
表示,p
是一个变量,而Person
是它所指的节点类型。
关系(Relationship)
关系用来表示节点之间的关系,如上图, ACTED_IN, REVIEWED, PRODUCED, WROTE 和 DIRECTED 都是对应节点类型之间关系连接.
在Cypher语句中用
[w:WORKS_FOR]
表示关系,w
是一个变量,而WORKS_FOR
是变量所指的关系.
标签(Label)
标签用来对节点和关系进行命名识别,例如上图中的 Movie 和 Person 就是节点标签, ACTED_IN, REVIEWED, PRODUCED, WROTE 和 DIRECTED就是关系标签
在Cypher语句中,标签都表示为
: Person
或:ACTED_IN
这种形式. 可以对标签制定一个变量,例如(p:Person)
, 其中p是变量,表示 Person 节点标签.
特性(Properties)
特性,为节点和关系添加属性,以 name-value的形式存储,类似键值对
在Cypher语句中,可以用
variable.
的形式,返回特定的properties.MATCH (m:Movie) return m.title, m.released
,这个语句只会返回title和released属性
图查询语言Cypher
创建节点Create
Create (p:Person {name: 'SHOA LIN'}) RETURN p
查询操作:Macth
Match (m:Movie) where m.released > 2005 RETURN m
Cypher查询语句中,节点(Node)用 (m:Movie)
表示,m
是变量, Movie
是节点类型,根据 where
里面的条件进行匹配, RETURN
返回变量 m
.
Match (m:Movie) where m.released > 2005 RETURN count(m)
除此以外, RETURN
还可以用表达式或者函数对变量 m
进行处理后再返回处理的结果.
MATCH (n) RETURN n limit 20
提供一些类似关键字的语法,对输出的数量进行限制.
Match (p:Person {name: 'Tom Hanks'}) RETURN p
MATCH (p:Person) where p.name = "Tom Hanks" RETURN p
通过精确的条件,用Match
进行查询. 上面两句话结果相同,但是下面的语句用了where
.
更多的关于
where
的用法请参考链接
复合语句(Merge Clause)
复合语句用来 查询已有的节点并绑定 或 创建新的节点并绑定.
MERGE (p:Person {name: 'John Doe'})
ON MATCH SET p.lastLoggedInAt = timestamp()
ON CREATE SET p.createdAt = timestamp()
Return p
该复合语句的意义:
如果Person{name:'John Doe'}
节点不存在,则创建,并设置createAt
属性.
如果节点存在,则设置lastLoggedInAt
属性
创建关系
MATCH (p:Person), (m:Movie)
WHERE p.name = "SHOA LIN" and m.title = "Cloud Atlas"
CREATE (p)-[w:WATCHED]->(m)
RETURN type(w)
上面语句对实例SHOA LIN
和Cloud Atlas
创建关系[w:WATCHED]
关系类别
Neo4j中可以有两种关系,传入(incoming)和传出(outgoing)关系.
以上图中,Tom Hanks存在传出关系,Cloud Atlas存在传入关系.
MATCH (p:Person)-[r:ACTED_IN]->(m:Movie) RETURN p,r,m
以上query语句中,Person存在传出关系,Movie存在传入关系,该语句返回存在ACTED_IN关系的Person跟Movie.
进阶Cyper查询语法
以下是一些例子
找出导演电影Cloud Atlas的导演
MATCH (m:Movie {title: 'Cloud Atlas'})<-[d:DIRECTED]-(p:Person) return p.name
找出与Tom Hanks一起出演电影的人
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(p:Person) return p.name
找出与电影Cloud Atlas存在关系的人
MATCH (p:Person)-[relatedTo]-(m:Movie {title: "Cloud Atlas"}) return p.name, type(relatedTo)
此处需要特别注意的是,用到了变量
[relatedTo]
,它会找出节点之间的所有关系
找出距离Kevin Bacon,3跳的电影和演员
MATCH (p:Person {name: 'Kevin Bacon'})-[*1..3]-(hollywood) return DISTINCT p, hollywood
此处
hollywood
指的是database中任意的节点(在这个case中指的是Person和Movie)