如何构建Sparql查询以获取空间字符串

时间:2014-09-30 05:23:36

标签: java sparql jena

下面的代码是大项目的一部分,有很少的记录,如hasName,hasAge,hasPlace,我正在尝试在java中构建sparql查询以获取记录。该查询适用于名称之间没有空格的名称。例如:爱丽丝,鲍勃。但是对于名字之间的名字不起作用,例如:Joy Mik,Ervin pol。

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>

但我的任务是更改这些名称:&#34; JoyMik&#34;,&#34; ErvinPol&#34; to&#34; Joy Mik&#34;,&#34; Ervin Pol&#34; ...所以我在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  |
---------------------------------------

但我想更改名称&#34; JoyMik&#34;来到&#34; Joy Mik&#34;它在上面给出了一个错误&#34; queryString&#34; ...我想我需要添加一些接受空格的东西......

1 个答案:

答案 0 :(得分:1)

您正在询问如何在名称中“插入空格”,并且正在寻找在SPARQL中执行此操作的方法。但这是解决此问题的错误方法 - 相反,如果您希望能够查询其中包含空格的名称,则应修复RDF数据。

正如评论中所指出的,URI不能包含空格。显然,您不能(轻松)仅使用URI对RDF中包含空格的名称进行建模。但是,对于这种情况,RDF模型提供literal values

如果我们将您的部分RDF数据转换为Turtle语法(更容易阅读和操作),您目前有这个:

   <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查询以获取名称显然取决于您选择的建模选项,但在任何一种情况下都应该直截了当。