2016-03-06 48 views
1

我創建了一個有一些拳擊比賽的簡單csv。我試圖弄清楚如何在Neo4j中對此進行建模。使用neo4j建模Cypher體育錦標賽

的CSV看起來是這樣的:

enter image description here

我在Neo4j的使用這個小數據集是因爲它看起來像Neo4j的將是輕鬆查詢的好辦法誰打誰,和練習的興趣誰了普通對手,或其他。

我的第一個想法是,每個拳擊手自然應該在'boxer'節點中表現出來,並且每個打鬥都應該在'fight'節點中表現出來。

這樣建模後,我意識到,實際上並不是每個拳擊手的一個節點,因爲隨着時間的推移,拳擊手的年齡會發生變化。所以我意識到每個拳擊手都必須爲每場戰鬥都有一個單獨的節點。例如,玻璃Joe有2個打架,他也因此出現了兩次,一次是當他23歲,一旦明年當他作戰睡魔,他是24:

enter image description here

不過這還挺失敗的目的。現在,我的圖將由3個節點的斷開連接組成,每個csv中的每個節點都有一個節點。那麼目的是什麼?

我的問題是,我怎麼可以模擬這種既簡單又複雜的情況是這樣的:某些類型的比賽或遊戲隨時間變化,以及競爭對手的節點的屬性的改變 - 但我們希望圖形是連接:

enter image description here

(哎呀:睡魔現在應該是51)

但話又說回來,我不認爲上面的圖片是正確的 - 所示的邊緣實際上是boxer節點的性能。如果他們是拳擊手的屬性......那麼他們不屬於邊緣,對吧?

這裏是我到目前爲止的代碼(和CSV lives here):

LOAD CSV WITH HEADERS FROM 
'file:///<grab it from dropbox please!>' AS line 
CREATE (b:boxer {boxer_id: line.boxer_id, name: line.name}) 
SET b.age = TOINT(age); 


LOAD CSV WITH HEADERS FROM 
'file:///<grab it from dropbox please!>' AS line 
MERGE(f:fight {fight_id: line.fight_id}); 

我結束了這些節點:

enter image description here enter image description here

...但不知道如何連接它們。任何意見或建議將不勝感激。

回答

1

你的第一個直覺是對的。理想情況下,如果你有拳擊手的生日,那就是你要存放的東西。這也可以幫助你分開具有相同名字/暱稱的拳擊手。不過,將拳擊手的年齡存儲爲關係的一部分的想法是一個好主意。

如果你真的想每個節點存儲每個拳手的每一行,你可以做到以下幾點:

(:BoxerRecord)-[:FOUGHT_IN]->(:Fight) 
(:BoxerRecord)-[:REPRESENTS]->(:Boxer) 

所以基本上你使用CREATE子句創建每個BoxerRecordMERGE每個Boxer記錄,以便他們合併在一起。

然後,如果你想找到所有兩個人的共同點已經打了拳擊手的(我做了一個:

MATCH 
    (b1:Boxer {boxer_id: 100), 
    (b2:Boxer {boxer_id: 101}) 
    (b1)<-[:REPRESENTS]-(:BoxerRecord)-[:FOUGHT_IN]->(:Fight)<-[:FOUGHT_IN]-(:BoxerRecord)-[:REPRESENTS]->(common_boxer:Boxer)<-[:REPRESENTS]-(:BoxerRecord)-[:FOUGHT_IN]->(:Fight)<-[:FOUGHT_IN]-(:BoxerRecord)-[:REPRESENTS]->(b2) 
RETURN common_boxer, count(*)