Neo4j:圖數據庫GraphDB(二)高級查找


 

接着上一篇,繼續介紹圖數據庫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;

 

查詢我們已經了解了不少,下一篇我繼續介紹怎么創建圖數據庫,希望繼續關注。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM