3.2數(shù)據(jù)操作
3.2.1一般功能
對數(shù)據(jù)庫的操作無非就是插入,更新,刪除和查詢, 其中最重要的就是查詢了.
3.2.1.1查詢
3.2.1.1.1普通查詢
基本上與常見的ORM工具提供的查詢語言(hibernate的HQL或)沒有什么區(qū)別,一般Select 語句能支持的都支持,在這里我就不再說了。具體的設(shè)計將在概要設(shè)計中定義.
注意我們不要開發(fā)一個像HQL那樣的查詢語言,而是應(yīng)該用一個SQL語句的抽象類庫來生成數(shù)據(jù)庫的原生SQL語句。
3.2.1.1.2圖查詢
這里就是與其他ORM工具提供的查詢語言(hibernate的HQL)不同的地方了,它提供了完整的圖查詢操作。
在設(shè)計一個圖查詢之前我們想象一下我們對一個圖進(jìn)行查詢對有什么樣子的需求呢
1.從一點或n點出發(fā),走指定的條件的線路,找出所有可到達(dá)的所有端點和線路
2.從一點或n點出發(fā),走任意線路,找出所有可到達(dá)的所有端點和線路,但這些端點必須符合指定的條件。
3.從一點或n點出發(fā),走指定的條件的線路,找出所有可到達(dá)的所有端點和線路,但這些端點必須符合指定的條件。
4.以上三個反過來,反過來查起始端點
因此我們將圖查詢設(shè)計為由三部分組成,源條目過濾表達(dá)式,目標(biāo)條目過濾表達(dá)式和關(guān)系過濾表達(dá)式。其中源條目過濾表達(dá)式和目標(biāo)條目過濾表達(dá)式在格式上完全相同,我們稱之為條目過濾表達(dá)式(itemFilter),而關(guān)系過濾表達(dá)式(relationshipFilter)則稍有不同,它是在條目過濾表達(dá)式的基礎(chǔ)上增加了一個遍歷深度參數(shù),你可以認(rèn)為關(guān)系過濾表達(dá)式(relationshipFilter)是條目過濾表達(dá)式(itemFilter)的派生類。
其中源條目過濾表達(dá)式,目標(biāo)條目過濾表達(dá)式是可選的,但不能相同兩個都沒有。
條目過濾表達(dá)式(itemFilter)
一個條目(item)匹配一個itemFilter當(dāng)且僅當(dāng)下列規(guī)定所有都為真時:
1.該條目符合定義在itemFilter中的約束。
2.當(dāng)它作為源條目過濾表達(dá)式時,都有一個匹配 relationshipFilter 并將此條目(item)作為源的關(guān)系。
3.當(dāng)它作為目標(biāo)條目過濾表達(dá)式時,都有一個匹配 relationshipFilter 并將此條目(item)作為目標(biāo)的關(guān)系。
雖然關(guān)系也是一個條目,但條目過濾表達(dá)式(itemFilter)不會返回關(guān)系實例。
關(guān)系過濾表達(dá)式(relationshipFilter)
一個關(guān)系匹配relationshipFilter當(dāng)且僅當(dāng)下列規(guī)定所有都為真:
符合 relationshipFilter中的約束的關(guān)系。如果源條目到目標(biāo)條目之間要經(jīng)過多個端點時,我們可能需要增加一個針對中間端點的itemFilter。
關(guān)系的源條目(item)匹配源條目過濾表達(dá)式。
關(guān)系的目標(biāo)條目(item)匹配目標(biāo)條目過濾表達(dá)式。
圖中源條目和目標(biāo)條目之間的邊的數(shù)量滿足指定的條件。
沒有一個源或目標(biāo)的關(guān)系,不能匹配relationshipFilter。
通過這三個部分的組合,基本上可以達(dá)到上面提到的要求了,便幾點需要注意:
1.一個圖中可能會有一個環(huán),用戶無需關(guān)心,實現(xiàn)本文的實現(xiàn)應(yīng)該自己處理
2.因為圖查詢其實是一個遞歸操作,因此需要對遞歸的深度進(jìn)行限制。
3.一個端點可能會有多個到達(dá)另一個端點的路徑,只要這些路徑符合relationshipFilter,那么它們就應(yīng)該出現(xiàn)在結(jié)果中。
出處:博客園
責(zé)任編輯:bluehearts
上一頁 GraphDatabase在關(guān)系數(shù)據(jù)庫中的實現(xiàn) [4] 下一頁 GraphDatabase在關(guān)系數(shù)據(jù)庫中的實現(xiàn) [6]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|