gpt4 book ai didi

java - 由于键入文字而无法获取结果 (xsd :string) querying SPARQL from Jena;

转载 作者:行者123 更新时间:2023-12-02 04:03:53 24 4
gpt4 key购买 nike

我的 Virtuoso 服务器在加载的本体上运行,以下查询通过将其粘贴到网络上 sparql 端点的文本字段来工作(ronto,由于安全原因我跳过了本体的前缀(抱歉),但我确信它的定义正确,因为查询可以工作但返回空列表,这是一个问题):

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select distinct (str(?p) as ?theme) where {?s ronto:isin "id-XXXX"^^xsd:string; ronto:mainThemes ?p}

以下不起作用(返回空列表);注意跳过的内容

xsd:string

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select distinct (str(?p) as ?theme) where {?s ronto:isin "id-XXXX"; ronto:mainThemes ?p}

所以,问题:我无法从 Java 中获得相同的结果,Jena 部门是:

        <dependency>
<groupId>org.apache.jena</groupId>
<artifactId>jena-arq</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>jena-core</artifactId>
<version>3.0.1</version>
</dependency>

所以,玩具代码:

   public static void main(String[] args) {
String isin = "id-XXXX";
final ParameterizedSparqlString qs = new ParameterizedSparqlString(
"select ?p where {?s ronto:isin ?isin^^xsd:string; ronto:mainThemes ?p.}");
qs.setBaseUri(base);
qs.setNsPrefix("owl", "http://www.w3.org/2002/07/owl#");
qs.setNsPrefix("xsd", "http://www.w3.org/2001/XMLSchema#");
qs.setNsPrefix("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
qs.setNsPrefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#");

qs.setLiteral("isin", isin);

System.out.println("Running as a query " +qs.asQuery());
try (QueryExecution exec = QueryExecutionFactory.sparqlService(publicSparqlEndpoint, qs.asQuery())) {
final ResultSet resultSet = exec.execSelect();
System.out.println(exec.getQuery());
ResultSetFormatter.out(resultSet);
}
System.out.println("Running as a string " + qs.toString());
try (QueryExecution exec = QueryExecutionFactory.sparqlService(publicSparqlEndpoint, qs.toString())) {
final ResultSet resultSet = exec.execSelect();
System.out.println(exec.getQuery());
ResultSetFormatter.out(resultSet);
}

输出是

PREFIX  xsd:  <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>


SELECT ?p
WHERE
{ ?s ronto:isin "id-XXXX" ;
ronto:mainThemes ?p
}
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?p
WHERE
{ ?s ronto:isin "id-XXXX" ;
ronto:mainThemes ?p
}

-----
| p |
=====
-----
Running as a string
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

select ?p where {?s ronto:isin "id-XXXX"^^xsd:string; ronto:mainThemes ?p.}

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?p
WHERE
{ ?s ronto:isin "id-XXXX" ;
ronto:mainThemes ?p
}

-----
| p |
=====
-----

其中 p 框是来自端点的空列表结果;

我测试了不基于类型文字的更简单的查询(此处为 xsd:string),它们给了我非空结果;

因此,很容易发现 exec 对象具有跳过的 xsd:string 查询,我猜这是导致结果为空列表的问题,但为什么它会以这种方式工作?解决方法的干净方法是什么?

解决方案我感谢@AndyS(注意两个更改:查询中的过滤器和QueryEngineHTTP):

public static void main(String[] args) {
String isin = "id-XXXX";
final ParameterizedSparqlString qs = new ParameterizedSparqlString(
"select ?p where {?s ronto:isin ?X; ronto:mainThemes ?p. FILTER (?X= ?isin^^xsd:string)}");
qs.setBaseUri(base);
qs.setNsPrefix("owl", "http://www.w3.org/2002/07/owl#");
qs.setNsPrefix("xsd", "http://www.w3.org/2001/XMLSchema#");
qs.setNsPrefix("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
qs.setNsPrefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#");
qs.setNsPrefix("ronto", "....");

qs.setLiteral("isin", isin);

System.out.println("Running as a string " + qs.toString());
try (QueryEngineHTTP exec = new QueryEngineHTTP(publicSparqlEndpoint, qs.toString())) {
final ResultSet resultSet = exec.execSelect();
System.out.println(exec.getQuery());
ResultSetFormatter.out(resultSet);
}
}

最佳答案

在 RDF 1.1 中,不带 xsd:string 的字符串和带 xsd:string 的字符串是相同的 RDF 术语。是否写入 ^^xsd:string 并不重要。

ARQ 打印不带 ^^xsd:string 的查询,这用于远程 SPARQL 调用。

Virtuoso 实例似乎与 RDF 1.1 不兼容。

您可以在查询中尝试使用值表达式:

{ ?s ronto:isin ?X;
ronto:mainThemes ?p.
FILTER ( ?X = "id-XXXX"^^xsd:string)
}

适用于 RDF 1.0 和 RDF 1.1 以及混合系统。

或者,直接使用 QueryEngineHTTP,而不是 QueryExecutionFactory。这允许应用程序传入一个字符串作为发送到远程端点的查询,而无需解析或检查。

关于java - 由于键入文字而无法获取结果 (xsd :string) querying SPARQL from Jena;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582915/

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