1. 程式人生 > >資料庫應用-對半結構化資料的宣告性訪問(Deklarativer Zugriff auf semistrukturierte Daten)-1

資料庫應用-對半結構化資料的宣告性訪問(Deklarativer Zugriff auf semistrukturierte Daten)-1

題外補充:deklarativ(declarative)
一直不是很清楚deklarativ是什麼意思,所以在這裡補充一下:
deklarativ中文是宣告的意思。他與process相對應。他關注的問題是was(what)而不是wie(how)。也就是說一個deklarativ過程(Deklarative Vorgehensweise)是對預期結果的屬性的一個描述,而不是對為獲得預期結果的方法的描述。同樣的在一個訪問語言中,我們希望存在儘可能多得deklarativ方法,同時儘可能少的operationell方法。

對於訪問的要求

簡單的OEM示例

這裡寫圖片描述
上圖是一個一般的半結構化文件。我們可以發現其中有很多不規則的地方,比如:
1. 餐廳可以由任意多個地址
2. 地址即可以處於葉子節點上,也可以處於內部節點上
3. zipcode有時是restaurant的組成成分,有時確實address的組成成分
從這個例子中我們可以看出:
1. 有時我們會要求能夠進行模糊一些的搜尋,比如我們要獲得所有的zipcode,不管他是不是屬於restaurant的直接組成成分。而這要求我們的訪問方法,具有一定的概括能力。
2. 另外,有時我們會想對上述中的情況進行區分,比如,我就要屬於restaurant的直接組成成分的哪個zipcode,其他的我不來電。這又要求我們的訪問方法能夠進行精確的表達。(當然,這的前提是使用者認識這個結構)

訪問語言的具體要求

說了那麼多,我們對這個宣告性的訪問的要求,究竟是神馬呢??
1. 表達能力強(Ausdrucksmächtigkeit)
2. 語義(Semantik)//不知啥意思??
3. 可互相組合的能力(Zusammensetzbarkeit)
4. 樣式(Schema)//還是不懂這個???
5. 對於給定的要求容易生成對應的語句(Einfache Erzeugbarkeit von Anfragen aus Programm)
接下來一個一個的探探:

表達能力強:

對於表達能力我們的最低要求是,關係模型訪問語言能做到的,這裡都能夠做到
另外這個語言除了應該有強的表達能力,還應注意這個能力又不能夠太強(我去啊,Sprache sollte ausdrucksmächtig sein, aber nicht zu ausdrucksmächtig)
具體的原因有兩個:
1. 表達能力太強的話,有時會難以進行優化???

σauthor=Heuer(BOOKSWHATEVER)better:σauthor=Heuer(BOOKS)WHATEVER
(Regel:Selektion und Join i.Allg. vertauschbar)
2. 他不能保證執行時間。

Semantik:

(Genaue Definition der Semantik ist erforderlich)
估計是指語句不要出現歧義

語句容易生成

要求語言精練簡潔
老師的意思是,這並不是針對這個訪問語言的屬性,而首先是這個開發環境的屬性。
“Karg, aber einfach”
MMn keine Eigenschaft der Anfragesprache, sondern in erster Linie der Entwicklungsumgebung.

Schema:

結構意識,同樣這個也不是針對訪問語言的,而是針對具體實現的。
“Stucutre-Consciousness”
Keine Eigenschaft der Querysprache, sondern der Implementierung.
//既然不是針對語言的幹嘛要編排在這裡啊??
例子:
假設Schema告訴我們了:
1. 只有直接位於根節點下面的book元素才含有zip元素
2. zip元素總是直接跟在address元素或book元素的後面
那麼我們就可以得到,下面的兩種說法是等價的:
1.
select X.title
from biblio.book X
where X.address.zip = “12345”
2.
select X.title
from biblio.* X
where X.*.zip = “12345”
上例說明了Schema的重要性(第一種方法比第二種快)。而且在這裡確實和訪問語言無關啊。
Im Fall von Tiefensuche fokusierte (und damit i.d.R. schnellere) Suche.
Beispiel setzt speziellen Ablauf beim Query Processing voraus, das muss aber i. Allg. nicht so sein.???

Zusammensetzbarkeit:

/*???
Identisch mit “Abgeschlossenheit”
Gegenbeispiel:Querysprache LOREL erzeugt Relationen aus OEM-Instanz,d.h. LOREL genügt der Anforderung nicht.
Konsequenz auf der syntaktischen Ebene:
“Referentielle Transparenz”
Name,Variable für semistrukturierte Daten Ausdruck
*/
-S20

XPath

先看一下OEM的路徑

標籤路徑(Label Path)

在OEM中可以用標籤序列(Folge von Labels:l1..ln)表示一個OEM中的物件o的標籤路徑。用Ii來表示到物件oi的邊(Label),每個標籤之間用“.”區分開。

資料路徑(Data Path)

同樣的我們也可以用標籤和元素物件ID的交替序列對路徑來表示資料物件o的資料路徑,同樣的我們需要“.”來對他們進行區分
我們說一個數據路徑是標籤路徑的一個例項,當他們中間的標籤序列是一致的時候。(Ein Data Path d ist Instanz eines Label Paths l, wenn die Folgen der Labels übereinstimmen.)
這裡寫圖片描述
//這個圖中有哪些是’bookstore.book.title’的例項呢???

目標集(Target Set)

我們用下面的式子定義元素s對應標籤路徑I的目標集(Das Target Set in einem Element s von einem label path l von s ist die Menge):

t={o|l1.o1.....ln.ol}

XPath產生的動機

目的是可以定位資料庫中任意位置的資料
(Motivation:Adressierung beliebiger logischer Dokumentbestandteile)
XPath並不是XML的語法
(XPath-Standardisieung im XML-Kontext???d.h. Knoten sind markiert)

XPath的兩種路徑

區分兩種不同的路徑:
相對路徑(Relativer Pfadausdruck):
與當前位置相關
(Auswertung beginnt an aktueller Position im Dokument; Ergebnis also kontextabhängig)
絕對路勁(Absoluter Pfadausdruck):
與絕對地址相關,與上下文無關
(Auswertung beginnt an absoluter Position im Dokument. Ergebnis also stets dasselbe, unabhängig vom Kontext.)

XPath的一些常用的表示

title或./title:當前元素下的所有的Title(注不限一個)

author/name/firstname:(這裡的author要求是當前元素下的嗎???)

//title:文件中的所有title(不限位置)

buch/*: buch元素的所有孩子

buch/@*: buch的所有屬性(包括屬性名和屬性值)

preis/@waehrung: preis的所有waehrung屬性

buch[Zusammenfassung]:得到所有包含有Zusammenfassung的buch(如buch[title])??

buch[Zusammenfassung]/title:得到上面得到的buch的title

autor[firstname = “Hans”],autor[string(firstname)=”Hans”]:

autor[(titel $or$ auszeichnung)]:關注的是中間的or,表示或的意思,另外前面的$符號和括號的可以省略的

my_namespace:*: 元素my_namespace下的所有元素(注與前面的區別,前面那個只有孩子)??

book[@genre=./author/@pipapo]/title等價於book[@genre=author/@pipapo]/title:

//book[.//firstname]: 輸出所有含有firstname元素的book元素

//book[//firstname]:當檔案中含有firstname的時候,輸出所有的book元素

//buch[./buchladen/@spezialitä[email protected]]:

book[price<10]//title:

book[price<10]/*/name:

book[title <= “The B”]/title:

book/author[first-name and last-name]:

後面幾個會輸出什麼呢???
book[author/first-name and author/last-name]/title:
中括號是可以巢狀的,括號直接指代括號鄰近的那個元素//不十分肯定?

(Schachtelung der eckigen Klammern ist möglich, Klammern beziehen sich auf das unmittelbar vorangegangene Element.)
book[author[first-name and last-name]]/title:

book[.//name=”Plato”]/title:

book/@genre:

book[@genre=”novel”]/title:

book[@genre=./author/@pipapo]/title:
最後一個會輸出什麼呢??

Location Paths

Location Paths由Location Steps組成
而Location Steps由下面三個部分組成:
1.軸axis(Achse)//這翻譯??
2.Node Test
3.謂詞(Prädikaten)
比如:/descendant::figure[position()=42]
其中/descendant::為軸
figure為Node Test
[position()=42]為謂詞
這裡寫圖片描述

路徑表達的每一步的結果都是按文件序排序的元素的列表。那麼
(doucument(“report1.xml”)//action)[price<10][position()<=2]
對應輸出的結果是神馬呢??
//position和sequence of Items有關???這個不懂??
(Kontext-Position bezieht sich auf sequence of items.)
把兩個中括號的內容給對換過來,結構還一樣嗎??

另一個例子:
文件:<A:T>bla</A:T><B:T>blubb</B:T>
表示不同namespace中的T元素
那麼問題來了,我們應該如何獲得所有的叫做T的元素呢??
//.[local-name(.)=”T”]

還是例子:
1. 請輸出所有的書元素,並且要求這個元素直接或間接的包含有firstname這個元素
2. 作者Plato的所有書的價格
//book[.//firstname]
//book[author/name=”Plato”]/price

XPath中的絕對的和相對的定位符(absolute und relative Lokator-Terme)

這裡寫圖片描述
//本來想只截樹圖的,結果果然還是這樣省事啊

用XPath實現Join

這裡寫圖片描述
輸出有德國verlag出版的所有的書的書名:
/Bib/Book[Verlag_name=/Bib/Verlag[Land=”Germany“]/Name]/title
在上面這個問題中,book和verlag也可以分別儲存在不同的文件中。
僅僅用XPath的話沒辦法實現輸出所有的(Land,Titel)對
(Es funktioniert-nur mit XPath-jedoch nicht:Ausgabe aller(Land,Titel)-Paare)

XML Schema:一致性的條件(Polymorphe Konsistenzbedingungen)

目的:特定的值(或不同值之間的組合)應該是唯一的//不確定啊???
(Ziel:Bestimmte Werte(bzw. Kombinatinen von Werten sollen eindeutig sein(Uniqueness Constraint.)))
步驟:
1.標識有唯一性要求的元素
2.標識這些元素對應的屬性值,如果他們也有唯一性的要求的話
3.確定在那些上下文環境(context)中,這些元素是需要保持其唯一性
(Elemente,für die Attributwert(e) eindeutig sein sollen, sind stets Tupel.??)
舉個例子:
Personen的Vorname和Nachname元素的組合在xxx中必須是唯一的
其中:
Personen是Selector-Element。也就是上面說得context(在Relation中沒有對應的元素,感覺有點對應關係的名字??)
(Selector-Element hat keine Entsprechung im Relationalen)
Vorname和Nachname的組合是Field-Element
Selector-Element和Field-Element總是成對出現的)
(Elemente, f[r die Attributwert(e) eindeutig sein sollen, sind stets Tupel. Dto. Kontext-Relationen)
這裡寫圖片描述

除了上面這種方法之外,我們還可以使用key condition(Schlüsselbedingung)來實現
<keyname="papierSchlüssel">
<fieldxpath="bib/paper/@id"/>
</key>
把paper中的id屬性作為key。key是必須唯一的,且是可以被引用的
<keyrefname="papierFremdschlüssel"refer="papierSchlüssel">
<fieldxpath="bib/paper/@references"/>
</keyref>
值的注意一下的是refer是和name這個屬性相關聯的。(Beachte:Mit refer bezieht man sich auf das name-Attribut einer Schlüsselbedingung, nicht auf das Schlüsselfeld)
references對應的值,應該可以在key中找到(Die Werte in references müssen also immer unter den Schlüsseln zu den Papieren zu finden sein.)