2014-09-30 3 views
0

아래 코드는 큰 프로젝트의 일부입니다. hasName, hasAge, hasPlace와 같은 레코드가 거의 없으며 Java에서 sparql 쿼리를 작성하여 레코드를 가져 오려고합니다. 쿼리는 이름 사이에 공백이없는 이름에 대해 작동합니다. 예 : 앨리스, 밥. 하지만 조이 믹 (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 
    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> 

몇 가지 기록과 샘플 RDF 파일입니다하지만 내 작업이 그 이름을 변경하는 것입니다 : "JoyMik를", "ErvinPol"을 "기쁨 미케", "어빈 폴" ... 그래서 나는

--------------------------------------- 
| Statement | name | age | place | 
======================================= 
| statement003 | JoyMik | 24 | Rome | 
--------------------------------------- 

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 
} 
... RDF 파일에서 레코드를 얻을 수 SPARQL에 쿼리를 작성하지만 이름이 "JoyMik" "기쁨 미케는"그 오류의를 제공하기를 변경하려면 위의 "queryString"... 나는 그것이 공백을 받아들이는 곳을 추가 할 필요가 있다고 생각했다. s .....

+3

대신 사용 하시겠습니까? URI는 공백을 포함 할 수 없습니다. 데이터를 확인하고 인코딩 방법을 확인하십시오. 일반적인 방법은 _ 또는 % 20을 (를) 사용하는 것입니다. – AndyS

+2

당신이 질의하는 데이터의 일부를 보여주십시오. Andy가 언급했듯이, URI에는 공백이 허용되지 않으므로, 과 같은 것이 있어서는 안됩니다. 쿼리하는 데이터를 표시하는 경우 (그리고 합법적 인 경우) 쿼리를 조정하는 방법을 보여줄 수 있습니다. –

+0

[Alice 26 Europe] [Bob 30 Rome] [ "Joy Mik"29 Paris] [ "Ervin pol"36 "St. Petersburg"] 이런 식으로 기록이 어떻게 나타나는지. – raj2103

답변

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 쿼리를 공식화하여 이름을 얻는 방법은 어떤 모델링 옵션을 선택 하느냐에 따라 달라 지지만, 어느 경우 든 알아낼 수 있어야합니다.

+0

솔루션을 제공해 주셔서 감사합니다. – raj2103

+0

장소를 추가하고 싶습니다 : "st. petersburg"문자열 표현을 저장하는 에 속성을 추가해야합니까 ?? – raj2103

+0

예, 있습니다. 좀 더 일반적으로 RDF 튜토리얼 (RDF 입문서와 같은)을 통해 RDF가 무엇인지, RDF를 사용하여 데이터를 모델링하는 방법을 익히는 것이 좋습니다. –

관련 문제