neo4j初识
1. docker安装neo4j
| [neo4j - Official Image | Docker Hub](https://hub.docker.com/_/neo4j) |
2. 启动
docker run -p 7474:7474 -p 7687:7687 run neo4j
# 如果开发环境不需要登录 则加上--env=NEO4J_AUTH=none
3. 连接
默认的连接和账号密码
http://localhost:7474
user: neo4j passd: neo4j
语法
通过内置教程摸索学习
建表
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),
CREATE (Emil:Person {name:"Emil Eifrem", born:1978})
CREATE (Emil)-[:ACTED_IN {roles:["Emil"]}]->(TheMatrix)
// 显示一部分数据
WITH TomH as a
MATCH (a)-[:ACTED_IN]->(m)<-[:DIRECTED]-(d) RETURN a,m,d LIMIT 10;
- 创建节点
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'}), TheMatrix为名字,Movie为对象,{}中为属性和赋值 - 创建关系
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),-[]->表示指向,[]中为关系对象,对象中包含属性
创建约束
CREATE CONSTRAINT FOR (n:Movie) REQUIRE (n.title) IS UNIQUE
Movie对象必须包含title属性,且唯一
建立索引
CREATE INDEX FOR (m:Movie) ON (m.released)
match 匹配
match是最基本的用法,用于传递一个模式,最后需要使用return返回结果,如
MATCH (tom:Person {name: "Tom Hanks"}) RETURN tom
表示匹配name为Tom Hanks的节点,并返回这个对象
MATCH (nineties:Movie) WHERE nineties.released >= 1990 AND nineties.released < 2000 RETURN nineties.title
然后可以使用where语句进行筛选
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies
该语句表示Tom Hanks 出演的所有电影。
-[]-> 模式匹配了关系的方向,[]中匹配关系,:是变量和类型的分隔符,此处即没有变量。
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN DISTINCT coActors.name
表示Tom Hank出演的电影的其他演员
距离模式
MATCH (bacon:Person {name:"Kevin Bacon"})-[*2]-(hollywood)
RETURN DISTINCT hollywood
通过[*1] 可以查询到与bacon相距1条链路的节点,通过[*1…4]可以查询据bacon相距1-4条链路的节点
最短路径
MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p
找到Kevin Bacon到Meg Ryan的最小路径,不限制关系
小练习
找到TomHanks合作演员的合作演员,并查询与TomHanks没有直接关系的双重合作演员,并计算他们有多陌生(距离多远)
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) AND tom <> cocoActors
RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC
删除
删除所有关系和节点
MATCH (n) DETACH DELETE n