2017-05-02 40 views
0

我是neo4j的新手,希望對db設計理念有所幫助。Neo4j數據庫 - 鏈接或屬性?

我有動物1000個在我的數據庫,每個大約10種之一(牛,綿羊,山羊,貓,狗.....)

在關係數據庫我將有一個動物表和物種表,每個動物的物種將通過動物ID和物種ID之間的連接來定義。

在neo4j中,「顯而易見的」方法是將動物作爲節點和物種作爲其屬性之一。但是,這似乎是一個倒退的步驟,因爲我面臨維護1000個具有拼寫差異風險的物種名稱副本的經典問題。

或者,我有1,000個動物節點和10個「物種」節點,每個動物指向成與IS_A關係的物種:

(菊花:動物) - [IS_A] - >(牛:母牛)

即 '感覺' 可怕笨拙。幾乎每個搜索都將針對特定的動物/物種組合進行搜索。

什麼是「首選」解決方案?

有一堆類似的決定。例如,每隻動物都是「活着」或「死亡」。我是否擁有這樣的財產?或者我將動物指向兩個稱爲活着和死亡的節點之一?

感謝任何指針

回答

0

你可以嘗試使用物種標籤,並在節點作爲該物種的動物:

(daisy:Cow{name:'daisy'}), (daffy:Duck{name:'daffy'}) 

如果您需要運行在多個種類的查詢,將它們視爲動物例如,您可以對所有節點多標籤:Cow,:Duck等節點也標記爲:Animal。

這裏的缺點是節點標籤在搜索中不能動態變化(或者至少,你不能像這樣利用索引搜索)。

因此,如果用戶可以輸入參數name:'daisy'species:cow,最快的查找(因爲你有一個動態的標籤處理),將有一個指數:Animal(name),並在此指數進行的比賽,然後在過濾器種類:

MATCH (animal:Animal) 
WHERE animal.name = $name 
AND $species in labels(animal) 
RETURN animal 

這不是比擁有一個物種在野外很大的不同:動物的節點,但它更容易在你的圖表(call db.labels)的可視性和報告爲標籤,這樣的錯誤拼寫應該是更容易既現貨又正確。一般而言,如果您的查找傾向於爲type + some property value,那麼將此類型建模爲節點標籤並在該組合上創建索引以進行快速查找是一種很好的選擇。對於布爾狀態,所有選項都可用(節點標籤,:與LifeState節點的關係如下:動物節點,布爾isAlive或isDead屬性)。我個人比較喜歡這裏的布爾屬性。