2017-09-08 88 views
3

我有一個約10M節點的數據庫。這些節點中有9.9M是在99%的查詢中未使用但在1%的查詢中仍然需要的詳細信息。對於99%的查詢,我該如何告訴圖數據庫不要遍歷某個特定的節點,而不管查詢中哪些路徑可能是一個虛擬卡?避免某些遍歷

向三個圖形數據庫添加標籤的道歉,我仍然在評估哪個圖形數據庫適合我們使用。

回答

1

使用Neo4j時,您可以使用labels將節點分組成集。標籤的示例是:User,Product,Admin等。此外,可以鍵入節點之間的relationships

這些結構可以在查詢時用來告訴數據庫哪些節點應該使用標籤/關係類型。

實例:

1 - 返回僅與特定節點標籤節點(:User):

MATCH (u:User) 
RETURN u 

2 - 返回節點與:User標籤和未Administrator標籤(因爲節點可以有一個以上的標籤):

MATCH (u:User) 
WHERE NOT u:Administrator 
RETURN u 

3 - 匹配的:User和之間的圖案僅關注類型:BUY從用戶到產品,其中u.id = 10並未考慮用戶爲:Administrator s。返回用戶和相關產品。

MATCH (u:User)-[:BUY]->(p:Product) 
WHERE u.id = 10 AND NOT u:Administrator 
RETURN u, p 
+0

謝謝!在Neo4J中它會減慢其他查詢,如果我有很多misc節點,我指定不要在遍歷期間去(尤其是在通配符遍歷中) –

1

隨着OrientDB你可以使用類層次結構,繼承和多態查詢,例如。你可以有兩個類,比如說「Class1」(相關的)和「Class2」(細節),它們共享一個超類,比如說「SuperClass」。

然後你可以在子類執行查詢,如果你只需要相關記錄:

MATCH 
    {class:Class1, as:p1} -TheEdgeClass-> {class:Class1, as:p2, while:($depth < 10)} 
RETURN $elements 

或超類,如果你既需要相關和詳細信息:

MATCH 
    {class:SuperClass, as:p1} -TheEdgeClass-> {class:SuperClass, as:p2, while:($depth < 10)} 
RETURN $elements 

第二個查詢是多態的,這意味着它返回「Class1」和「Class2」的記錄,因爲它們都擴展了「超類」。

完全相同的情況適用於邊類,因此您可以擁有邊類的層次結構,並使用多態性來選擇需要遍歷的關係。

當然還有其他策略,例如。您可以將WHERE條件添加到模式並根據屬性進行過濾,但是您將失去數據局部性的優勢(不同類別的記錄存儲在不同的文件中,因此當您基於單個類進行查詢時,您有更多機會擁有熱緩存和較少的磁盤訪問)。

也可以認爲類層次結構可以是多層次的(一個實際的類樹)

+0

謝謝Luigi!在OrientDB中它會減慢其他查詢,如果我有很多misc節點,我指定不要在遍歷時進行(尤其是在通配符遍歷中) –

+0

一般而言,單個查詢的性能取決於你所穿過的節點/邊緣(即不在穿越深度)。如果你使用多態,你將在特定和普通查詢上都有很好的性能(沒有減速) –