绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Neo4j:图数据库GraphDB(二)查找
2022-04-18 11:15:58

三 查找操作

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;


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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

GraphDB
创建时间:2022-04-18 10:29:03
GraphDB
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • LCR_
    专家
戳我,来吐槽~