“電影關系圖”實例將電影、電影導演、演員之間的復雜網狀關系作為藍本,使用Neo4j創建三者關系的圖結構,雖然實例數據規模小但五臟俱全。
步驟:
一、 創建圖數據:將電影、導演、演員等圖數據導入Neo4j數據庫中
cypher語句:
1 CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'}) 2 CREATE (Keanu:Person {name:'Keanu Reeves', born:1964}) 3 CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967}) 4 CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961}) 5 CREATE (Hugo:Person {name:'Hugo Weaving', born:1960}) 6 CREATE (LillyW:Person {name:'Lilly Wachowski', born:1967}) 7 CREATE (LanaW:Person {name:'Lana Wachowski', born:1965}) 8 CREATE (JoelS:Person {name:'Joel Silver', born:1952}) 9 CREATE 10 (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix), 11 (Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix), 12 (Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix), 13 (Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix), 14 (LillyW)-[:DIRECTED]->(TheMatrix), 15 (LanaW)-[:DIRECTED]->(TheMatrix), 16 (JoelS)-[:PRODUCED]->(TheMatrix)
每個cypher的意思如下,但是要整體運行,否則他們的關系不會連在前面8句中創建的節點上,因為最后面的7句運用到了前面CREATE時的變量,比如:最后一行JoelS變量就是對應的第8行的JoelS。單獨運行也會產生關系,但是節點是Neo4j自動生成的,只有一個id,如下:
這個查詢ACTED_IN類型的關系,上面的綠色和藍色為整體運行cypher產生的,底下的全紅是單獨運行產生的,點擊中間紅點,可以看見左下角只有Neo4j自己生成的id(138)。
下面每步驟為單獨運行和解釋cypher:
1. 創建電影節點
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
此cypher語句使用CREATE指令創建了一個Movie節點。這個節點帶有3個屬性,{title:'The Matrix', released:1999, tagline:'Welcome to the Real World'},分別代表電影標題,發行時間,宣傳詞。btw:The Matrix(黑客帝國)帶你進入程序世界,程序員必看電影。
單獨運行完之后則創建了一個節點如下:
2. 創建人物節點
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964}) CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967}) CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961}) CREATE (Hugo:Person {name:'Hugo Weaving', born:1960}) CREATE (LillyW:Person {name:'Lilly Wachowski', born:1967}) CREATE (LanaW:Person {name:'Lana Wachowski', born:1965}) CREATE (JoelS:Person {name:'Joel Silver', born:1952})
此7句cypher創建了7個Person節點,每個節點有2個屬性。查看如下圖:
3. 創建演員導演關系
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix), (Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix), (Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix), (Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix), (LillyW)-[:DIRECTED]->(TheMatrix), (LanaW)-[:DIRECTED]->(TheMatrix), (JoelS)-[:PRODUCED]->(TheMatrix)
CREATE下面前4行創建演員與電影的關系,后3句創建導演與電影的關系。
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)的意思是演員Keanu在電影TheMatrix中扮演Neo角色roles:['Neo']。
(LillyW)-[:DIRECTED]->(TheMatrix)的意思是LillyW導演了[:DIRECTED]電影TheMatrix。
運行完此語句形成如下圖:
可見此圖中節點是Neo4j自動生成的,這個138是從最上面第一張圖中得到的。因為創建關系這條語句找不到節點變量Keanu、TheMatrix等。
二、檢索節點
運行整體cypher圖數據結構創建完成后,下面介紹檢索相關操作。
1. 查找人員
a. 查找名為Carrie-Anne Moss的人
MATCH (m {name: "Carrie-Anne Moss"}) RETURN m
b. 查詢誰導演了The Matrix
MATCH (m:Movie {title: "The Matrix"})-[:DIRECTED]-(n) RETURN n.name
這個例子使用了電影關系圖中完整cypher的一小部分,完整cypher貼到下篇。
cypher-refcard : https://neo4j.com/docs/cypher-refcard/current/