3

場景:一個簡單的地址簿,用戶可以創建自己的聯繫人,並通過分組添加他們來組織他們。聯繫人可能有多個地址。圖形數據庫模式設計 - 這適合neo4j嗎?

我創建瞭如下圖: [架構設計] [1]

我想查詢所有誰放置在X組的聯繫人和生活在Y國。

這種模式設計是否足夠用於這些目的(我想使用neo4j數據庫)?

回答

3

看起來像country的概念應該是圖中的頭等公民,因爲您的查詢取決於它。圖模型設計通常會受到查詢模式的影響。

因此,我建議每個國家都有一個節點標記爲Country,並將Address節點與:LOCATED_IN節點連接到該國家。 (因此從地址節點中刪除國家屬性)。

與該改變您的查詢一樣簡單:

MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->()-[:LOCATED_IN]->(:Country{name:'US'}) 
RETURN contact 
+0

謝謝!我很感激。 – Moody 2015-04-01 08:30:01

+0

順便說一下,斯蒂芬,你有沒有任何機會對這種情況下的密集節點影響性能的統計數據進行任何比較?假設我有'Prop'屬性(可能是索引)〜20K節點,我查詢數據庫只是爲了找到所有具有'Prop'的節點,然後過濾具體的'Prop'值(可能的Prop值的數量是相當小的:我可以枚舉它們全部(比如1000個可能的值))。如果我創建一個標籤「Prop」並創建20K關係,它會是一個更好的設計嗎?在性能方面更好的選擇是什麼? – tkroman 2015-04-02 12:33:20

+0

您需要注意,如果您將很多地址同時連接到同一個國家,則可能會遇到鎖定問題。創建關係意味着鎖定其開始和結束節點。不過,通過在全國各地設立幾個「對接節點」,您可以輕鬆解決這個問題。該地址然後選擇一個對接節點,例如通過對線程ID進行一致性散列 - 這可以防止鎖定問題。在查詢方面,我沒有可用的測量。 – 2015-04-02 12:49:58

2

一種選擇是具有地址的另一個節點的國家,由斯特凡的Armbruster指出。如果您不想更改數據結構,只需在Address的「國家/地區」字段中添加一個索引即可。那麼你可以有一個查詢

MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->(:Address{country:'US'})

+0

謝謝。我欣賞小費! – Moody 2015-04-01 08:30:07