2014-02-13 96 views
0

我不能完全告訴我們,如果這是一個壞的問題,但我認爲它有一個明確的答案......標籤,屬性或節點? Cypher支架/ Neo4j的

我在我的構建首先圖形數據庫工作。它將保存對內容的引用的節點。這些節點將連接到術語節點。每個術語節點可以是七種類型之一(人員,組織,術語等)。

什麼是最好的方式來實現數據庫中的術語類型,因爲它涉及到查詢速度?用戶將根據條款搜索內容,其想法是讓他們根據其類型過濾條款。

作爲一個屬性似乎沒有問題,因爲它需要在查詢期間訪問每個術語的JSON對象。

(contentNode:content)-[:TAGGED_WITH]-(termNode:term {type: {"people":false,"organizations":false,"physicalObjects":true,"concepts":true,...}} 

標籤直觀意義,我作爲不同類型的真的只是標註術語節點更具體。每個術語節點可以具有標籤「術語」以及相關類型。我對此有些困惑,但似乎標籤不能用作密碼查詢中的動態屬性,因爲它阻止了查詢被緩存/正確索引。

(contentNode:content)-[:TAGGED_WITH]-(termNode:term:physicalObject:jargon:...) 

我能想到的最後一個選項將有一個節點對每個術語「類型」和項連接到相關類型的節點。現在這看起來像是最好的選擇(儘管是最詳細的)。

(contentNode:content)-[:TAGGED_WITH]-(termNode:term)-[:IS_TYPE]-(typeNode:termType {name:jargon}), (termNode:term)-[:IS_TYPE]-(typeNode:termType {name:physical object}), (termNode:term)-[:IS_TYPE]-(typeNode:termType {name: ...}) 

任何有更多經驗/知識的人都可以參與嗎?非常感謝。

回答

4

我不知道我完全理解你正在試圖做什麼,但我想回答的幾個點,然後也許你可以詳細說明:

但似乎標籤不能被用作密碼查詢中的動態屬性,因爲它可以防止 查詢被緩存/正確索引。

使用動態標籤不會對索引造成影響,但是您會對緩存有所瞭解。密碼解析器保留之前看到的查詢緩存,以便它不必每次都重新生成查詢計劃。鑑於您只有有限數量的標籤,無論如何您都可以緩存所有組合。

我會建議嘗試使用您的數據的一個子集的各種模型,並測量每個查詢的可讀性爲&。

馬克

+1

我可能會使用它的標籤,他們被添加到替換類型屬性以及類別節點。 你是對的,你不能動態添加它們,但也許因爲你只有7種類型可以在客戶端預建查詢,並選擇它們。我認爲標籤最容易閱讀和使用,您也可以將它們用於Neo4j瀏覽器中的可視化錨定。 –

+0

預構造查詢的唯一問題是這些類型意味着要與另一個組合使用(我希望用戶選擇返回的術語類型)。 81個查詢(我已經添加了兩個類型)似乎很多預寫。我絕對同意,語法雖然會更清晰。 – bornytm