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。
这样可以避免一次性导入导致的内存溢出。
浙公网安备 33010602011771号