2011-08-06 51 views
1

圖形數據庫將數據存儲爲節點,屬性和關係。如果我需要從一個基於查詢的對象檢索一些特定的數據,那麼我需要檢索多個對象(因爲查詢可能有很多結果)。圖形數據庫中的面向對象編程

考慮面向對象的編程這個簡單的場景圖中的數據庫:

我有用戶,其中每個用戶被存儲爲一個對象的(曲線)的數據庫。我需要檢索生活在特定地點的用戶列表(地點屬性存儲在用戶對象中)。那麼,我該怎麼做呢?我的意思是每次需要執行某些操作時都會檢索到不必要的數據(在這種情況下,可能需要檢索整個用戶對象)。圖形數據庫中的函數式編程不是更好嗎?

這個例子只是我想到的上述問題的一個簡單比喻。不要把它當作基準。所以,問題仍然存在,圖形數據庫中的面向對象編程有多棒?

+0

我寧願製作地方節點,並使用關係連接用戶。 - 爲什麼使用graphdb就像你想要一些非圖形類型的存儲?! AFAIK所有圖形數據庫都帶有索引支持,因此您可以使用它來代替逐個檢查屬性值。 - 我認爲你混淆了兩個不同的問題:使用OO編程並不意味着你必須始終從DB加載完整的對象。也許你可以試着讓問題更清楚? – nawroth

回答

1

每個節點都有可以映射到對象字段的屬性。您可以手動執行此操作,也可以使用spring-data進行映射。

3

圖形數據庫不僅僅是頂點和邊緣。在大多數圖形數據庫(例如neo4j)中,除了具有id的頂點和具有label的邊緣之外,它們都具有屬性列表。通常,在基於Java的圖形數據庫中,這些屬性僅限於Java primatives - 其他所有內容都需要序列化爲字符串(例如日期)。這種對頂點/邊緣屬性的映射既可以通過使用諸如getPropertysetProperty之類的方法手動完成,也可以使用Frames之類的東西,這是一個使用TinkerPop堆棧的對象映射器。

1

大多數圖形數據庫至少有一種頂點/邊的索引。例如,InfiniteGraph支持B-樹,Lucene(用於文本)和分佈式的可縮放索引類型。如果您在字段中沒有索引作爲過濾器,則需要遍歷該圖並在每個步驟中自行應用謂詞。希望這會減少要遍歷的節點的數量。

0

Blockquote我需要檢索生活在特定位置的用戶列表(place屬性存儲在用戶對象中)。

還有一個更好的辦法。與用戶分開的位置。不要將位置作爲屬性,請爲位置創建節點。 所以你可以有(u:User)-[:LIVES_IN]->(l:Location)類型的關係。

變得更容易獲取生活在一個特定的地方有一個簡單的查詢用戶的列表:

match(u:User)-[:LIVES_IN]->(l:Location) where l.name = 'New York'. 
return u,l. 

這將返回居住在紐約的所有用戶,而不必掃描每個節點的所有屬性。這是一個更快的方法。