neo4j(一)入门篇(4)

1、索引

创建索引可以加速查找

创建索引

CREATE INDEX ON :Person(name)

  

这样基于Person name的查找将会变快

删除索引为

DROP INDEX ON :Person(name)

  

2、聚合函数

count(x) Count the number of occurrences

min(x) Get the lowest value

max(x) Get the highest value

avg(x) Get the average of a numeric value

sum(x) Sum up values

collect(x) Collect all the values into an collection

如果我们想要展示一个演员演出的所有电影:可以使用collect

MATCH (person:Person)-[:ACTED_IN]->(movie:Movie)
RETURN person.name, collect(movie.title);

 返回演员合作的所有导演的名字: 

MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-(:DIRECTED)-(d:Person)
RETURN a.name,collect(DISTICT d.name) as directors

  由于一个演员可以和一个导演合作多次,因此如果要得到惟一的结果,可以使用DISTICT来显示唯一的导演名字

Exercise: Return the count of movies in which each actor has acted

 

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
RETURN p.name count(m.title)

  

Exercise: Return the count of movies in which an actor and director have jointly worked

 
MATCH (actor:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(director:Person)
RETURN actor.name,director.name,count(m)

  

3、聚合函数Top n

如果要显示在所有电影中参演次数最多的演员名称:可以使用count来统计次数并排序。

MATCH (person:Person)-[:ACTED_IN]->(movie:Movie)
RETURN person.name, count(movie)
ORDER BY count(movie) DESC
LIMIT 10;

  DESC 代表降序

Exercise: Recommend three actors that Keanu Reeves should work with (but hasn’t).

这是一个关于朋友的朋友查找的问题。

MATCH (keanu:Person {name:"Keanu Reeves"})-[:ACTED_IN]->()<-[:ACTED_IN]-(coworker:Person),
      (coworker)-[:ACTED_IN]->()<-[:ACTED_IN]-(coworkerOfCoworker)
WHERE coworkerOfCoworker <> keanu  AND NOT((keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(coworkerOfCoworker))
RETURN coworkerOfCoworker.name, count(coworkerOfCoworker)
ORDER BY count(coworkerOfCoworker) DESC
LIMIT 3;

  

4、导入数据

导入规范化的csv文件

使用LOAD CSV

导入电影

LOAD CSV WITH HEADERS
FROM "http://data.neo4j.com/intro/data/movies_to_load.csv"
AS line
CREATE (movie:Movie { id:line.id, title:line.title, released:toInt(line.year) });

  

导入演员

LOAD CSV WITH HEADERS
FROM "http://data.neo4j.com/intro/data/persons_to_load.csv"
AS line
MERGE (actor:Person { id:line.id })
ON CREATE SET actor.name=line.name;

 MERGE如果如果已经存在的话就不变动,没有的话就新增

ON CREATE如果是新增的话就设置姓名

导入电影中演员的角色

LOAD CSV WITH HEADERS
FROM "http://data.neo4j.com/intro/data/roles_to_load.csv"
AS line
MATCH (movie:Movie { id:line.movieId })
MATCH (person:Person { id:line.personId })
CREATE (person)-[:ACTED_IN { roles: [line.role]}]->(movie);

  

导入为规范的文件

数据格式:

title;released;actor;born;characters
Back to the Future;1985;Michael J. Fox;1961;Marty McFly
Back to the Future;1985;Christopher Lloyd;1938;Dr. Emmet Brown

  

导入:

LOAD CSV WITH HEADERS
FROM "http://data.neo4j.com/intro/data/movie_actor_roles_to_load.csv"
AS line FIELDTERMINATOR ";"
MERGE (movie:Movie { title:line.title })
ON CREATE SET movie.released = toInt(line.released)
MERGE (actor:Person { name:line.actor })
ON CREATE SET actor.born = toInt(line.born)
MERGE (actor)-[r:ACTED_IN]->(movie)
ON CREATE SET r.roles = split(line.characters,",")

  

导入大量数据

我们可以在LOAD CSV前增加PERIODIC COMMIT。

这样可以避免一次性导入导致的内存溢出。

 

 

posted @ 2018-09-13 22:15  tutu_python  阅读(183)  评论(0)    收藏  举报