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;
  1. 创建节点 CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'}), TheMatrix为名字,Movie为对象,{}中为属性和赋值
  2. 创建关系  (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