繁体   English   中英

由于键入文字(xsd:string)从耶拿(Jena)查询SPARQL,因此无法获得结果;

[英]Can't get results due to typed literal (xsd:string) querying SPARQL from Jena;

我的Virtuoso服务器运行了已加载的本体,下面的查询通过将其粘贴到Web上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 deps是:

        <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-box是端点的空列表结果;

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

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

解决方案我感谢@AndyS(注意两个更改:查询中的FILTER和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 这允许应用程序将字符串作为查询传递给远程端点,而无需解析或检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM