neo4j | 基本用法
neo4j基本用法。
一、安装
二、创建
(重要)首先创建约束,按我目前的理解,目的是使约束属性唯一。并且根据我在创建索引时的报错信息,被约束的属性会自动创建索引。下边第一句的意思是,给Movie标签的title属性创建约束。
1 | CREATE CONSTRAINT ON (n:Movie) ASSERT (n.title) IS UNIQUE |
(重要)然后是创建索引,目的是提高查询速度。下边命令的意思是给Movie标签的released属性创建索引。
1 | CREATE INDEX ON :Movie(released) |
这里需要注意,官方给出的示例为:
1 | CREATE INDEX FOR (m:Movie) ON (m.released) |
这条命令运行会报错,原因是版问问题。
官方说明:
1 | On neo4j version 4.X |
三、查询
1、简单查询
查询名为”Tom Hanks”的演员。
1 | MATCH (tom:Person {name: "Tom Hanks"}) |
MATCH
是关键字,表示这是个查询语句,相当于SQL语句中的SELECT
。tom
是变量名,自己随便定义,将冒号后边的查询结果暂存。Person{name:"Tom Hanks"}
表示在Person标签下寻找name属性为Tom Hanks的节点。RETURN
返回查询结果。
查询10个人并返回他们的名字。
1 | MATCH (people:Person) |
LIMIT
限制查询结果数量。
查找上世纪90年代的电影并返回电影名。
1 | MATCH (nineties:Movie) |
WHERE
是条件语句,限制MATCH
的查询结果。
2、复合查询
Tom Hanks演过什么电影?
由于示例是英文版,“参演”这个关系标签在数据库中是“ACTED_IN”。
1 | MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) |
首先在Person标签中查找name属性为Tom Hanks的节点,然后顺着ACTED_IN关系查找另一头的节点。
这里需要注意的是,关系是有方向的-[:ACTED_IN]->
表示了关系的指向,如果不加箭头,只用两个减号,就表示查询的时候不限定方向。
谁和Tom Hanks合作过?
1 | MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) |
DISTINCT
限定结果只返回一次,即使有重复,也只返回第一个。
哪些人和Cloud Atlas有关?
1 | MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) |
这里边的relatedTo
是个局部变量,改成a
也是一样的。
3、距离查询
查找和Kevin Bacon距离4跳以内的电影和演员。
1 | MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood) |
[*1..4]
表示不定长的路径,最小为1,最大为4。
使用自带函数shortestPath()寻找从Bacon Path到Meg Ryan的最短路径。
1 | MATCH p=shortestPath( |
这个就没啥好说的,记录一下shortestPath()函数。
4、查询并计数
寻找没和Tom Hanks合作过、但和Tom Hanks合作者合作过的演员。
1 | MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors), |
这里有两点需要注意,一是<>
表示不等,二是count(*)表示对所有变量进行计算。
关于count()函数,原文如下:
1 | Assume we have the following return statement: |
四、删除
删除所有节点和关系:
1 | MATCH (n) DETACH DELETE n |
其中DETACH DELETE
代表删除节点及关系