2016-03-01 154 views
1

我已經寫了一個暗號查詢,以顯示兩個影片節點之間的關係:如何使用d3.js可視化Neo4j中兩個節點之間的關係?

MATCH (m1:Movie)-[r*1..2]-(m2:Movie) 
where m1.movieID = '1' AND m2.movieID = '2' 
RETURN r 
LIMIT 25 

它的回報率這在Neo4j的瀏覽器,而這也正是我想在d3.js.創造什麼樣的最終,movieID將是參數,因此每個電影對的結果都會有所不同。

enter image description here

我一直在關注的Neo4j的核心Ruby的例子seen here創建自己的圖形,但我的問題是,我不能在兩個動作之間RETURN公共節點,即Tag/Country節點。

我應該如何解決這個問題?我應該創建一個查詢來返回這兩部電影,而另一個查詢返回它們之間的公共節點?我將如何編寫這後一個查詢?我真的被困在我如何可視化這種關係......

回答

2

也許你應該嘗試匹配的路徑,而不是像你現在的關係。喜歡的東西:

MATCH p=(m1:Movie { movieID: 1 })-[r*1..2]-(m2:Movie { movieID: 2 }) 
RETURN p; 

然後可以使用collection functions的路徑對象p上做任何你用它喜歡。例如,如果要獲取內部節點,可以使用nodes(p),並簡單地刪除第一個和最後一個節點(將分別爲m1m2),並獲取路徑上的節點。

0

你可以用關係回到電影:

MATCH (m1:Movie)-[r*1..2]-(m2:Movie) 
WHERE m1.movieID = '1' AND m2.movieID = '2' 
RETURN m1, m2, r 
LIMIT 25 

雖然這可能會給你重複。如果你打算用D3來顯示它,可能你想要的是所有的關係和它們的開始/結束節點。要做到這一點,你可以這樣做:

MATCH (m1:Movie)-[rels*1..2]-(m2:Movie) 
WHERE m1.movieID = '1' AND m2.movieID = '2' 
RETURN rels 
UNWIND rels AS r 
WITH DISTINCT r AS rel 
WITH startnode(rel) AS startnode, endnode(rel) AS endnode, rel 
LIMIT 25 

一般來說,你最終想要的是一個包含節點和關係的集合。因此,你可以這樣查詢結果:

result = neo4j_session.query(query_string) 

data = {nodes: [], relationships: []} 
result.each do |row| 
    data[:nodes] << row.startnode 
    data[:nodes] << row.endnode 
    data[:relationships] << row.rel 
end 

data[:nodes].uniq! 
+0

對於'data [:relationships]'你不需要源和目標節點嗎?不會'row.rel'只返回關係屬性(如果存在的話)? – f7n

+0

'rel'返回關係對象(如果你處於服務器模式,它將成爲'CypherRelationship'對象),它應該有'start_node_neo_id'和'end_node_neo_id'方法 –

相關問題