2015-02-10 55 views
2

我有一個包含多個節點的數據集,所有這些節點都標記爲claim,它們可以具有各種屬性(名稱P1,P2等,通過P2000)。目前,claim節點中的每一個節點可以僅具有這些屬性中的一個,並且每個屬性具有可以是不同類型的值(即,P1可以是字符串,P2可以是浮點型,P3整數等)。我還需要能夠通過任何屬性查找節點(即"find all nodes with P3 which equals to 42")。Neo4j中可以接受混合類型索引嗎?

我已經將它建模爲具有屬性value並根據P屬性標籤的節點。然後我在標籤claim和屬性value上定義模式索引。查找然後看起來像這樣:

MATCH (n:P569:claim) WHERE n.value = 42 RETURN n 

我的第一個問題是 - 這是好的有這樣的索引?是否允許混合類型索引?

第二個問題是,上述工程查找(雖然我不知道它是否使用索引或沒有),但是這不 - 注意標籤順序切換:

neo4j-sh (?)$ MATCH (n:claim:P569) WHERE n.value>0 RETURN n; 
IncomparableValuesException: Don't know how to compare that. Left: "113" (String); Right: 0 (Long) 

P569性質都是數字,但其他P值的字符串屬性是其中一個是「113」。不知何故,即使我說的標籤應當是既要求和P569,在「113」值仍包含在比較中,即使它沒有P569標籤:

neo4j-sh (?)$ MATCH (n:claim) WHERE n.value ="113" RETURN LABELS(n); 
+-------------------+ 
| LABELS(n)   | 
+-------------------+ 
| ["claim","P1036"] | 
| ["claim","P902"] | 
+-------------------+ 

這裏有什麼問題 - 爲什麼它的工作原理有一個標籤順序但不是另一個?這個數據模型可以改進嗎?

+0

如果你想比較它們,你還可以在屬性或toInt()上使用toString()。索引可以有混合類型。您還可以使用'USING INDEX n:claim(value)'添加索引提示。在一個索引中,我認爲這些值主要是以類似的格式(或字符串)存儲的 – 2015-02-13 01:30:27

回答

3

讓我至少試着對您的問題進行旁觀,還有另一種方法可以對此進行建模,以至少解決一些問題。

您正在將屬性名稱編碼爲標籤。也許你想這樣做,以加快查找該屬性適用的節點子集;仍然看起來像是通過將無與倫比的數據值全部放在名爲「value」的同一個屬性中造成了很多困難。

如果除了使用這些標籤,每個屬性的名稱與該值相同,該怎麼辦?即:

CREATE (n:P569:claim { P569: 42}); 

你仍然可以得到您的標籤查找,而是通過分離的屬性名稱,你能保證查詢規劃絕不會不小心在它建立一個執行計劃的方式比較無比值。然後,您的這個節點查詢將是:

MATCH (n:P569:claim) WHERE n.P569 > 5 AND n.P569 < 40 RETURN n; 

請注意,如果你知道要使用正確的標籤,那麼你保證知道使用正確的屬性名稱。通過使用不同名稱的屬性,如果您以P569的數據總是整數的方式記錄您的數據,那麼您無法完成您無法比擬的情況。 (我認爲這是因爲密碼執行該查詢的具體方式而發生的)

這裏可能存在的一個缺點是,如果您必須對所有這些屬性進行索引,那麼可能會有很多索引,但仍可能是考慮。

+0

據我所知,命名屬性不同將需要維護2000個索引,而且我的實驗顯示試圖創建2000個索引使得Neo4j停止並且OOM錯誤導致崩潰。 – StasM 2015-02-11 05:01:32

+0

你的數據量是多少?你需要2000年的索引嗎?像現在一樣將數據類型混合在一個屬性中,看起來好像除非你仔細計劃你的查詢,比較不可比的值經常會出現。在某些方面,這是對單一屬性的誤用,因爲您將2,000種不同類型的信息放入一個屬性中。 – FrobberOfBits 2015-02-11 17:20:10

+0

全部數據量約爲100M項目。是的,所有的屬性都需要編入索引。 – StasM 2015-02-11 18:38:05

0

我認爲有必要退後一步,想一想你真正想實現的目標,以及爲什麼你首先要有2000個屬性,以及如何在圖形中對它們進行不同的建模?

此外,請確保放棄不需要的屬性,並使用coalesce()提供默認設置。

+0

我有2000個屬性,因爲數據項可以有2000個不同的屬性。我願意提供關於如何在圖表中表現最好的想法。 – StasM 2015-02-13 06:56:10

相關問題