2015-02-11 58 views
1

我正在研究關於托爾金精靈家族分支的本體論。 Here是OWL文件。提煉我的SPARQL查詢

現在我已經加入了SPARQL標籤前綴的門徒新這樣的:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX gene: <http://www.semanticweb.org/kayurin/ontologies/2015/1/casata_di_finwe#> 

然後開始我的第一次查詢的工作,第一個成功的一個是:

SELECT ?Prole 
WHERE 
{ 
?x gene:nomeCompleto ?Prole; 
gene:haGenitore gene:Finwe. 
} 

這是意味着在列「Prole」(後代)數據屬性NomeCompleto(我使用的字符串值,因爲不確定如何使用用於Individuo類的成員的特殊字符)列下的所有類的成員「Individuo 「(人)誰擁有財產haGenitore Finwe(Finwe作爲父母)。

它的工作原理,感覺有點太羅嗦了,但是(同時)。這是一個很好的基礎,我對其他相關查詢工作,如:

SELECT ?FigliMaschi 
WHERE 
{ 
?x gene:nomeCompleto ?FigliMaschi; 
gene:haGenitore gene:Finwe; 
gene:haSesso gene:MaschioSesso. 
} 

成功地返回了我所有的NomeCompleto字符串'芬蘭人的男孩。

現在,我的第一個問題:

的字符串在此確切格式返回給我。 「[insertnamehere]」@

他們有「」和@我真的不知道他們來自哪裏。

問題二:

我試過演變查詢:

SELECT ?Prole 
WHERE 
{ 
?x gene:nomeCompleto ?Prole; 
gene:haGenitore gene:Finwe; 
gene:haSesso gene:MaschioSesso. 
?y gene:nomeCompleto ?FiglieFemmine; 
gene:haGenitore gene:Finwe; 
gene:haSesso gene:FemminaSesso. 
} 

當時的想法是讓兩列,一個與兒子和另一個與我們prolificating精靈的女兒。

它的確如此,但男性列中的名稱被複制三次,而女性列中的名稱被複制兩次,以便兩列中的條目數相等。

有沒有辦法解決這個問題?

第三個問題:

我希望得到兩列:神父和菲利,首先應該有剛剛芬威的名稱,第二個他的所有後代。

查詢是:

SELECT ?Padre ?Figli 
WHERE 
{ 
?a gene:nomeCompleto ?Padre; 
gene:Finwe. 
?x gene:nomeCompleto ?Figli; 
gene:haGenitore gene:Finwe. 
} 

不行的,空場。

最後,我想通過在nomeFormale和nomeComune中分割nomeCompleto來改進數據屬性(爲列表中的每個成員添加第二個名稱)。我試圖做出一個查詢,它將返回nomeCompleto兩次,但唯一的一個工作是這樣的:

SELECT ?Nome1 ?Nome2 
WHERE 
{ 
?x gene:nomeCompleto ?Nome1; 
gene:haGenitore gene:Finwe. 
?y gene:nomeCompleto ?Nome2; 
gene:haGenitore gene:Finwe. 
} 

即使這樣,列表是一團糟。

任何人都可以解決這個問題?

在此先感謝大家。

注:

我使用的是門徒新5.0測試版。 (唯一的版本,在我的電腦上工作。) HermiT 1.3.8.3作爲一個理由。 Java版本8更新31 Windows 8.1 64位

+0

語言標記RDF文字有一個詞法形式和語言標記。例如,我的名字可以表示爲「約書亞泰勒」。它是字符串「Joshua Taylor」,語言是英語。這是你應該期待的那種結果。 – 2015-02-11 14:04:53

+0

如果你有三個不同的問題,你應該問三個不同的問題。堆棧溢出是爲了幫助有類似問題的每個人,並且結合這樣的問題使得難以找到個人問題和答案。 – 2015-02-11 14:05:58

+0

對於第二個問題,你只需要做'select?son?daugher where {{... sons query ...} union {... daughters query ...}}''。 – 2015-02-11 14:06:51

回答

2

我認爲你真的需要閱讀SPARQL。你應該停止思考,就好像它是一個數據庫。

  1. NomeCompleto是String類型的數據屬性。這就是您將第一個查詢的結果看作字符串變量的原因。
  2. 您可以創建兩個查詢的聯合,以便您將有一些空的單元格,但不會重複。

    SELECT distinct ?Prole ?FiglieFemmine WHERE { {?x gene:nomeCompleto ?Prole; gene:haGenitore gene:Finwe; gene:haSesso gene:MaschioSesso. } Union{ ?y gene:nomeCompleto ?FiglieFemmine; gene:haGenitore gene:Finwe; gene:haSesso gene:FemminaSesso. } }

  3. 首先查詢是不完整的,你缺少的,我認爲是haProle屬性。所以你需要找到所有的人與他們的父親,然後根據你心中的父親來篩選他們。事情是這樣的:

    SELECT distinct * WHERE { ?padre gene:haProle ?figili. ?padre gene:nomeCompleto ?n1. ?figili gene:nomeCompleto ?n2. Filter (?padre=gene:Finwe) }

  4. 如果你想返回的東西兩次(同樣的事情),你的東東是使用相同的對象(查詢X)。我真的不確定你想要做什麼,但這是如何得到一個名字兩次。

    SELECT ?Nome1 ?Nome2 WHERE { ?x gene:nomeCompleto ?Nome1; gene:haGenitore gene:Finwe. ?x gene:nomeCompleto ?Nome2; gene:haGenitore gene:Finwe. }

+0

是的,我正在閱讀有關它,但我的大學提供的材料(實際上我也在網上找到的材料)對我來說有點混亂,所以我開始嘗試一點點以獲得他們所說的感受。如果你能指導我一些材料\來源,你相信可能是有用的,我非常感謝。 – Kay 2015-02-12 03:03:12

+0

@Kay [標準](http://www.w3.org/TR/sparql11-query/)實際上包含了很多示例。訣竅的一部分是在高層次上瀏覽,然後重讀更詳細的內容。 – 2015-02-12 03:04:16

+0

@Joshua:謝謝,會這樣做。當我第一次看它時,感覺更多的是針對專家而不是新手,我會盡力遵循你的建議。 – Kay 2015-02-12 03:06:56