2010-06-29 40 views
1

我對SPARQL,OWL和Jena很新,所以請原諒我是否問完全愚蠢的問題。自從幾天以來,我遇到了一個讓我瘋狂的問題。我使用下面的字符串作爲一個耶拿QueryFactory.create(queryString)查詢,SPARQL - 找到本體需要什麼?

queryString = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>"+ 
"PREFIX ho: <http://www.flatlandfarm.de/fhtw/ontologies/2010/5/22/helloOwl.owl#>" + 
"SELECT ?name ?person ?test ?group "+ 
"WHERE { ?person foaf:name ?name ; "+ 
"   a ho:GoodPerson ; "+ 
"   ho:isMemberOf ?group ; "+ 
"}"; 

直到今天早上,它的工作,只要我只要求從FOAF命名空間屬性。只要我從我自己的命名空間請求屬性,我總是得到空的結果。雖然我在這裏發佈這個問題,並做了一些最終測試,以便能夠儘可能準確地發佈它,但它突然發揮作用。因此,我不知道究竟要問什麼,我在發佈之前刪除了我的問題。幾個小時後,我使用Protege的Pellet插件創建並導出推斷的模型。我把它叫做helloOwlInferred.owl,並將它上傳到我的服務器上helloWl.owl所在的目錄中。我調整了我的方法來加載推斷的本體,並更改了上面的查詢,以便前綴ho:也被分配給推斷的本體。立刻,沒有任何工作了。確切地說,它不再是什麼工作,但它是我一直到今天早上與我的原始查詢相同的症狀。我的前綴不再工作。我做了一個簡單的測試:將所有helloWorldInferred.owl文件(我的服務器上的前綴和我加載的本地副本)重命名爲helloWorld.owl。奇怪的是,修復了一切。

將其重命名爲helloWorldInferred.owl再次打破了一切。等等。那裏發生了什麼?我是否需要等待幾周,直到我的本體被「註冊爲有效前綴」?

回答

2

問題也許你的OWL文件包含rdf:ID="something"構造(或相對URL的一些其他形式,例如爲rdf:about="#something")?

rdf:ID通過使用OWL文件的基本URL,相對URL被擴展爲完全絕對URL,例如http://whatever/file.owl#something。如果文件中沒有明確指定基本URL(使用類似xml:base="http://whatever/file.owl"的文件),那麼文件在Web服務器上的位置(或者在您的文件系統中,如果您加載本地文件)將被用作基本URI。

因此,如果您移動文件或在多個位置有副本,則文件中的URI將發生更改,因此您必須相應地更改SPARQL查詢。

包括明確的​​或避免相對URI和rdf:ID應該解決該問題。

+0

非常感謝。你的回答讓我走上了正軌。 – Tom 2010-07-02 08:41:51

1

前綴和QNames的整個想法只是壓縮URI以節省空間並提高可讀性,最常見的問題是在定義本身或QNames中拼寫錯誤。

最有可能的是,您在查詢中使用的前綴定義會導致生成的URI與本體中的實際URI不匹配。

話雖這麼說,您的問題可能是由於一些與耶拿因此它很可能是值得一問你對Jena Mailing List

1

看起來這是由Protege中的錯誤(或特徵?)引起的。當我用新名稱導出推斷本體時,Protege將xmlns(blank)和​​的定義更改爲新文件的名稱,但它沒有更改實際名稱空間的定義。

xmlns="http://xyz.com/helloOwl.owl" => xmlns="http://xyz.com/helloOwlInferred.owl" 
xml:base="http://xyz.com/helloOwl.owl" => xml:base="http://xyz.com/helloOwlInferred.owl" 

xmlns:helloOwl="http://xyz.com/helloOwl.owl" => xml:base="http://xyz.com/helloOwl.owl" 
<!ENTITY helloOwl "http://wxyz.com/helloOwl.owl#" > => <!ENTITY helloOwl "http://wxyz.com/helloOwl.owl#" > 

由於我修復它似乎工作。
我的故障沒有檢查實際的來源與必要的關注。