下面的代码是大项目的一部分,有很少的记录,如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; ...我想我需要添加一些接受空格的东西......
答案 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查询以获取名称显然取决于您选择的建模选项,但在任何一种情况下都应该直截了当。