Neo4j:图数据库GraphDB(二)查找

2022-04-18 00:00:00 索引 查询 语句 电影 演员

三 查找操作

1过滤 name = "Tom Hanks"的人

MATCH (n:Person)
WHERE n.name = "Tom Hanks"
RETURN n;
另一种写法:

MATCH (n:Person {name:"Tom Hanks"})
RETURN n;


2 排序Order, 限制Limit and 跳跃Skip

根据演员的出生日期排序输出:

MATCH (a:Person)-[:ACTED_IN]->()
RETURN a.name, a.born
ORDER BY a.born


利用limit和skip分页,下面显示第二页的语句:

MATCH (a)-[:ACTED_IN]->(m)
RETURN a.name, m.title
SKIP 10
LIMIT 10;


3distinct关键字使用

查询所有电影的参演演员中年龄高的五个人:

MATCH (a)-[:ACTED_IN]->()
RETURN DISTINCT a
ORDER BY a.born
LIMIT 5


说了这么多,下面两个问题大家能写出对应的CQL吗:

( 1 )查询演员 Tom Hanks 出演的所有电影,并且电影的出版在2000以后?

MATCH (tom:Person)-[:ACTED_IN]->(movie)
WHERE tom.name="Tom Hanks"
AND movie.released > 2000
RETURN movie.title;


( 2 )查询Keanu Reeves 出演的所有电影,并且他的角色是Neo?

MATCH (keanu:Person)-[r:ACTED_IN]->(movie)
WHERE keanu.name="Keanu Reeves"
AND "Neo" IN r.roles
RETURN movie.title;


3 使用比较筛选查询结果

<的使用:

MATCH (tom:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(a:Person)
WHERE tom.name="Tom Hanks"
AND a.born < tom.born
RETURN a.name;
更复杂一点的语句:

MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(movie),
(movie)<-[:ACTED_IN]-(a:Person)
WHERE a.born < tom.born
RETURN DISTINCT a.name, (tom.born - a.born) AS diff;


4使用模式查询

MATCH (gene:Person)
WHERE gene.name="Gene Hackman"
RETURN gene;
复杂一点的:找到所有和Gene一起工作的演员?

MATCH (gene:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)
WHERE gene.name="Gene Hackman"
RETURN DISTINCT other;
再复杂一点:找到与Gene一起工作并且导演过自己电影的伙伴?

MATCH (gene:Person)-[:ACTED_IN]->(m),
(other)-[:ACTED_IN]->(m)
WHERE gene.name="Gene Hackman"
AND (other)-[:DIRECTED]->()
RETURN DISTINCT other;
更复杂的了:找到与Gene一起工作过,但没有同时和"Robin Williams"合作的演员?

MATCH (gene:Person {name:"Gene Hackman"})-[:ACTED_IN]->(movie),
(other)-[:ACTED_IN]->(movie),
(robin:Person {name:"Robin Williams"})
WHERE NOT (robin)-[:ACTED_IN]->(movie)
RETURN DISTINCT other;


5 索引 index

创建索引:INDEX

CREATE INDEX ON :Movie(title);
CREATE INDEX ON :Person(name);
这样的话,查询中有根据name或title的语句就会很快了。(索引的目的就是为了加速查询的)

比如下面的这条语句速度就会提高:

MATCH (gene:Person)-[:ACTED_IN]->(m),
(other)-[:ACTED_IN]->(m)
WHERE gene.name="Gene Hackman"
RETURN DISTINCT other;


创建标签索引:

CREATE INDEX ON :Person(name);
CREATE INDEX ON :Movie(title);
标签的检索速度就可以提升了,比如下面这句:

MATCH (tom:Person)-[:ACTED_IN]->(movie),
(kevin:Person)-[:ACTED_IN]->(movie)
WHERE tom.name="Tom Hanks" AND
kevin.name="Kevin Bacon"
RETURN DISTINCT movie;


6聚类操作

复制代码
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
复制代码
eq

MATCH (a:Person)-[:ACTED_IN]->(m)
RETURN a.name, collect(m.title);


eq2

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


查询我们已经了解了不少,下一篇我继续介绍怎么创建图数据库,希望继续关注。

相关文章