接着上一篇,繼續介紹圖數據庫Neo4j: http://www.cnblogs.com/rongyux/p/5537028.html
三 高級查找操作
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;
查詢我們已經了解了不少,下一篇我繼續介紹怎么創建圖數據庫,希望繼續關注。