2014-09-30 31 views
0

下面的代碼是大項目的一部分,有幾個記錄像hasName,hasAge,hasPlace,我試圖在java中構建sparql查詢以獲取記錄。該查詢適用於名稱之間沒有空格的名稱。例如:Alice,Bob。但是對於名字空間不起作用的人喜歡:Joy Mik,Ervin pol。如何構建Sparql查詢以獲取具有空間的字符串

SELECT ?statement ?name ?age ?place 
WHERE 
{ ?statement recordNS:hasName <http://example/base/name> 
    ?statement recordNS:hasAge ?age 
    ?statement recordNS:hasPlace ?place  

}

的實際查詢:

public static getAllStatementsForPerson(String PersonName) { 
    String queryString = 
     "PREFIX defaultNS: <" + defaultNS + "> " + 
    "SELECT ?statement ?age ?place " 
    + "WHERE " 
    + "{ ?statement defaultNS:hasname <" + defaultNS + PersonName + "> . " 
    + "?statement defaultNS:hasAge ?age " 
    + "?statement defaultNS:hasPlace ?place }"; 
    System.out.println("queryString is: " + queryString); 
    Query query = QueryFactory.create(queryString); 
    QueryExecution qexec = QueryExecutionFactory.create(query, som); // "som" is an ontology model 
    try { 
     ResultSet results = qexec.execSelect();   
     while (results.hasNext()) { 
       ResultSetFormatter.out(System.out, results, query); 
    } 
    } 
    catch(Exception e){ e.printStackTrace();} 
    finally {qexec.close();} 
    return statements; 
} 

請人幫助我,這是我第一次問對該網站解決方案...如果我做了任何錯誤,請正確我。

聽到的是與幾個記錄樣本RDF文件....

<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:owl="http://www.w3.org/2002/07/owl#" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#" 
    xmlns:defaultNS="http://Example/Base/Record_#" 
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> 

    <owl:Class rdf:about="http://Example/Base/Record_#Name"/> 
    <owl:Class rdf:about="http://Example/Base/Record_#Age"/> 
    <owl:Class rdf:about="http://Example/Base/Record_#Place"/> 
    <rdf:Property rdf:about="http://Example/Base/Record_#hasName"/> 
    <rdf:Property rdf:about="http://Example/Base/Record_#hasAge"/> 
    <rdf:Property rdf:about="http://Example/Base/Record_#hasPlace"/> 

    <defaultNS:RecordStatement rdf:about="http://Example/Base/Record_#statement001"> 
     <defaultNS:hasName> 
     <defaultNS:Name rdf:about="http://Example/Base/Record_#Alice"/> 
     </defaultNS:hasName> 
     <defaultNS:hasAge> 
     <defaultNS:Age rdf:about="http://Example/Base/Record_#26"/> 
     </defaultNS:hasAge> 
     <defaultNS:hasPlace> 
     <defaultNS:Place rdf:about="http://Example/Base/Record_#Europe"/> 
     </defaultNS:hasPlace>  
    </defaultNS:RecordStatement> 

    <defaultNS:RecordStatement rdf:about="http://Example/Base/Record_#statement002"> 
     <defaultNS:hasName> 
     <defaultNS:Name rdf:about="http://Example/Base/Record_#Bob"/> 
     </defaultNS:hasName> 
     <defaultNS:hasAge> 
     <defaultNS:Age rdf:about="http://Example/Base/Record_#30"/> 
     </defaultNS:hasAge> 
     <defaultNS:hasPlace> 
     <defaultNS:Place rdf:about="http://Example/Base/Record_#Rome"/> 
     </defaultNS:hasPlace>  
    </defaultNS:RecordStatement> 

    <defaultNS:RecordStatement rdf:about="http://Example/Base/Record_#statement003"> 
     <defaultNS:hasName> 
     <defaultNS:Name rdf:about="http://Example/Base/Record_#JoyMik"/> 
     </defaultNS:hasName> 
     <defaultNS:hasAge> 
     <defaultNS:Age rdf:about="http://Example/Base/Record_#24"/> 
     </defaultNS:hasAge> 
     <defaultNS:hasPlace> 
     <defaultNS:Place rdf:about="http://Example/Base/Record_#Paris"/> 
     </defaultNS:hasPlace>  
    </defaultNS:RecordStatement> 

    <defaultNS:RecordStatement rdf:about="http://Example/Base/Record_#statement002"> 
     <defaultNS:hasName> 
     <defaultNS:Name rdf:about="http://Example/Base/Record_#ErvinPol"/> 
     </defaultNS:hasName> 
     <defaultNS:hasAge> 
     <defaultNS:Age rdf:about="http://Example/Base/Record_#36"/> 
     </defaultNS:hasAge> 
     <defaultNS:hasPlace> 
     <defaultNS:Place rdf:about="http://Example/Base/Record_#StPetersburg"/> 
     </defaultNS:hasPlace>  
    </defaultNS:RecordStatement> 
</rdf:RDF> 

但我的任務就是改變這些名字:「JoyMik」,「ErvinPol」到「歡樂Mik的」,「歐文波爾」 ...所以我建立一個查詢SPARQL中擺脫RDF文件中的記錄...

PREFIX defaultNS: <http://Example/Base/Record_#> 
SELECT ?statement ?name ?age ?place 
WHERE { 
    ?statement defaultNS:hasName <http://Example/Base/Record_#JoyMik> . 
    ?statement defaultNS:hasAge ?age . 
    ?statement defaultNS:hasPlace ?place 
} 
--------------------------------------- 
| Statement | name | age | place | 
======================================= 
| statement003 | JoyMik | 24 | Rome | 
--------------------------------------- 

但是我要改名字「JoyMik」到「歡樂Mik的」它給人以錯誤上面的「queryString」...我想我需要添加一些東西,它接受空白s .....

+3

你在的地方是什麼意思? URI中不能有空格。檢查數據並查看它是如何編碼的:常用的方法是用_替換或使用%20。 – AndyS 2014-09-30 08:38:20

+2

請顯示您正在查詢的一些數據。正如Andy所說,URI中不允許有空格,所以不應該有像<'這樣的東西。如果您顯示的是您正在查詢的數據(以及它是否合法),我們可以告訴您如何調整您的查詢。 – 2014-09-30 11:41:33

+0

[Alice 26 Europe] [Bob 30 Rome] [「Joy Mik」29 Paris] [「Ervin pol」36「St. Petersburg」]通過這種方式記錄如何存在。 – raj2103 2014-09-30 15:41:35

回答

1

您在詢問如何在名稱中插入空格,並正在尋找某種方法在SPARQL中執行此操作。但是,這是解決這個問題的錯誤方法 - 相反,如果您希望能夠查詢其中包含空格的名稱,則應該修復RDF數據。

正如在註釋中指出的那樣,URI不能包含空格。所以顯然,你不能(容易地)使用URI來爲RDF中包含空格的名稱建模。但是,對於這種情況,RDF模型提供了literal values

如果我們翻譯您的RDF數據的一部分龜語法(有點更容易閱讀和操作),你現在有這樣的:

<http://Example/Base/Record_#statement003> a defaultNS:RecordStatement ; 
         defaultNS:hasName <http://Example/Base/Record_#JoyMik> . 
    <http://Example/Base/Record_#JoyMik> a defaultNS:Name . 

一種選擇是使模型更簡單:你期待的hasName屬性包含人類可讀的名字,所以你可以只使用一個字符串,而不是一個URI來模擬它,並獲得完全擺脫<http://Example/Base/Record_#JoyMik> URI的,像這樣:

<http://Example/Base/Record_#statement003> a defaultNS:RecordStatement ; 
         defaultNS:hasName "Joy Mik"@en . 

正如你所看到的,我們直接添加一個字符串值而不是URI。順便提一下,@en位是可選的:它是一個語言標記,它表示字符串所在的語言(在本例中爲英語)。如果你不需要或者不需要,你可以關閉它。

另一種選擇是保持<http://Example/Base/Record_#JoyMik> URI,但要加一個屬性,它存儲的字符串表示,例如像這樣:

<http://Example/Base/Record_#statement003> a defaultNS:RecordStatement ; 
         defaultNS:hasName <http://Example/Base/Record_#JoyMik> . 
    <http://Example/Base/Record_#JoyMik> a defaultNS:Name ; 
         rdfs:label "Joy Mik"@en . 

這種做法是一個更復雜的模型,但它也有優點:在RDF中,你不能輕易說出關於的字面值:它們就像你的圖中的「終點」。如果你希望能夠說出人們的名字(而不是人們自己),這是一個很好的模型選擇。

你再如何制定一個SPARQL查詢來獲取名稱顯然取決於其造型您選擇的選項,但它應該很容易在任何情況下弄清楚。 <://例子/基/ HTTP名稱>

+0

謝謝你的解決方案,我的工作就可以了... – raj2103 2014-10-02 22:05:54

+0

如果我想要添加的地方:「聖彼得堡」我需要添加一個屬性到存儲字符串表示? – raj2103 2014-10-02 22:20:21

+0

是的,你這樣做。更一般地說,我建議你通過RDF教程(例如上面鏈接的RDF入門教程)瞭解一下RDF,瞭解RDF是什麼以及如何最好地使用它來建模數據。 – 2014-10-02 22:40:08