我正在尝试在下面的数据集上运行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;
}
}
}
它的三角形符号。有什么帮助吗?
答案 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不匹配,通常会导致查询无法返回。