gpt4 book ai didi

java - 如何构建 Sparql 查询来获取带空格的字符串

转载 作者:行者123 更新时间:2023-12-01 12:28:50 26 4
gpt4 key购买 nike

下面的代码是大项目的一部分,有一些记录,如 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;
}

请大家帮助我,这是我第一次在这个网站上寻求解决方案...如果我做错了什么,请纠正我。

Hear 是带有少量记录的示例 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”到“Joy Mik”、“Ervin Pol”...所以我在 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”更改为“Joy Mik”,它在上面的“queryString”处给出错误...我想我需要在接受空格的地方添加一些内容......

最佳答案

您询问如何在名称中“插入空格”,并正在寻找某种方法在 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 查询来获取名称显然取决于您选择的建模选项,但在任何一种情况下都应该很容易弄清楚。

关于java - 如何构建 Sparql 查询来获取带空格的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26113316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com