SPARQL查询结果未显示图表中的任何内容

时间:2014-11-12 00:09:28

标签: sparql

我正在尝试在下面的数据集上运行sparql查询

@prefix ex: <http://www.example.com/ont#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

{
    ex:repository ex:createdBy ex:repOwner; ex:title "Rep_1".
}

ex:books 
{
    ex:book_1 a ex:Science; ex:size "100"; ex:title "Science book 1".
    ex:book_2 a ex:Science; ex:size "1000"; ex:title "Science book 2". 
    ex:book_3 a ex:Fantasy; ex:size "100"; ex:title "Fantasy book 1".
}

当我尝试使用sparql查询时,我得到一个空表结果。我从图表中得不到任何结果。以下是我的查询

 prefix ex: <http://www.example.com/ont#> 
 prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
 prefix xsd: <http://www.w3.org/2001/XMLSchema#> 


SELECT * WHERE
{
  GRAPH ex:books 
  {
    GRAPH ?g { }
    {
      ?s ?p ?o;
    }
  }
}

它的三角形符号。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

您确定要加载数据并正确查询吗?如果没有完整的最小示例,即用于加载和查询数据的代码(或者使用命令行/ GUI工具执行此操作时使用的相关步骤),我们实际上做的不仅仅是推测。

当我将数据加载到Apache Jena Fuseki免责声明 - 我是Apache Jena项目的提交者)时,查询成功运行并产生以下结果:

------------------------------------------------------
| g        | s         | p        | o                |
======================================================
| ex:books | ex:book_1 | ex:title | "Science book 1" |
| ex:books | ex:book_1 | ex:size  | "100"            |
| ex:books | ex:book_1 | rdf:type | ex:Science       |
| ex:books | ex:book_3 | ex:title | "Fantasy book 1" |
| ex:books | ex:book_3 | ex:size  | "100"            |
| ex:books | ex:book_3 | rdf:type | ex:Fantasy       |
| ex:books | ex:book_2 | ex:title | "Science book 2" |
| ex:books | ex:book_2 | ex:size  | "1000"           |
| ex:books | ex:book_2 | rdf:type | ex:Science       |
------------------------------------------------------

您的查询

你的查询有一个奇怪的地方是你有一个GRAPH ?g {}子句,它是对所有图形的空扫描,它应该产生所有图形的名称(假设一个表现良好的标准兼容的SPARQL实现)。然后,这会加到?s ?p ?o图上ex:books的扫描中。

这意味着您将每个可能的图表名称与ex:books中的每个可能匹配项进行组合,因此?g变量不会告诉您数据来自哪个图表(除非您只有一个命名图)我认为是你的实际意图?

尝试以下方法:

PREFIX ex: <http://www.example.com/ont#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT * WHERE
{
  GRAPH ?g
  {
    ?s ?p ?o;
  }
}

这会查找所有图形中的所有匹配项,这可能不是您想要的。如果您只想查询特定的ex:books图表,请尝试改为:

PREFIX ex: <http://www.example.com/ont#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT * WHERE
{
  GRAPH ex:books
  {
    ?s ?p ?o;
  }
}

如果你真的需要变量ex:books的值以供稍后处理,你可以使用BIND将其作为常量引入,例如。

PREFIX ex: <http://www.example.com/ont#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT * WHERE
{
  GRAPH ex:books
  {
    ?s ?p ?o;
    BIND(ex:books AS ?g)
  }
}

调试提示

调试的关键是尝试运行一个应该返回所有数据的查询,例如。

SELECT * WHERE
{
  { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } }
}

如果没有返回任何内容,则表示您已正确加载数据或未正确查询数据。如果它确实返回了某些内容,它应该告诉您确切的数据位置和内容。

通常情况下,您可能会发现某个地方无意中输入错误,如果加载的数据和查询中的URI不匹配,通常会导致查询无法返回。