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
代表删除节点及关系
Gitalk 加载中 ...