我有一個約10M節點的數據庫。這些節點中有9.9M是在99%的查詢中未使用但在1%的查詢中仍然需要的詳細信息。對於99%的查詢,我該如何告訴圖數據庫不要遍歷某個特定的節點,而不管查詢中哪些路徑可能是一個虛擬卡?避免某些遍歷
向三個圖形數據庫添加標籤的道歉,我仍然在評估哪個圖形數據庫適合我們使用。
我有一個約10M節點的數據庫。這些節點中有9.9M是在99%的查詢中未使用但在1%的查詢中仍然需要的詳細信息。對於99%的查詢,我該如何告訴圖數據庫不要遍歷某個特定的節點,而不管查詢中哪些路徑可能是一個虛擬卡?避免某些遍歷
向三個圖形數據庫添加標籤的道歉,我仍然在評估哪個圖形數據庫適合我們使用。
使用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
隨着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條件添加到模式並根據屬性進行過濾,但是您將失去數據局部性的優勢(不同類別的記錄存儲在不同的文件中,因此當您基於單個類進行查詢時,您有更多機會擁有熱緩存和較少的磁盤訪問)。
也可以認爲類層次結構可以是多層次的(一個實際的類樹)
謝謝Luigi!在OrientDB中它會減慢其他查詢,如果我有很多misc節點,我指定不要在遍歷時進行(尤其是在通配符遍歷中) –
一般而言,單個查詢的性能取決於你所穿過的節點/邊緣(即不在穿越深度)。如果你使用多態,你將在特定和普通查詢上都有很好的性能(沒有減速) –
謝謝!在Neo4J中它會減慢其他查詢,如果我有很多misc節點,我指定不要在遍歷期間去(尤其是在通配符遍歷中) –