例如,在this site上,执行第一个SPARQL查询并创建非常相似的内容:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX p: <http://dbpedia.org/property/>
SELECT *
WHERE {
?name p:name <http://dbpedia.org/resource/Olivier_Theyskens> .
}
尝试执行它:here
我没有结果。但是,请将查询修改为以下内容:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX p: <http://dbpedia.org/property/>
SELECT *
WHERE {
?name p:name ?otherthing.
}
我得到了结果,即使它们不是我想要的结果。
为什么第一个查询不起作用 - 我做错了什么? :/
答案 0 :(得分:6)
在这种情况下,我认为这是因为您向后订购了查询语句。
DBpedia资源( <http://dbpedia.org/resource/Olivier_Theyskens>
)是实体或主题( ?s
),属性( p:name
)是属性或谓词( ?p
),该属性的值( ?name
)是值或对象( ?o
)。
SPARQL期望所有语句都是 { ?s ?p ?o }
,但您的语句似乎写成 { ?o ?p ?s }
......
总而言之,如果您尝试此查询 -
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX p: <http://dbpedia.org/property/>
SELECT *
WHERE
{
<http://dbpedia.org/resource/Olivier_Theyskens> p:name ?name .
}
- 你会得到the results I think you want。
答案 1 :(得分:4)
您的第一个查询的问题是p:name
链接到Literal并且您尝试匹配URI。
如果您希望第一个查询起作用,则必须使用链接到URI而不是文字的属性http://dbpedia.org/ontology/artist
:
SELECT *
WHERE {
?s <http://dbpedia.org/ontology/artist> <http://dbpedia.org/resource/The_Velvet_Underground> .
}
请注意属性<http://dbpedia.org/ontology/artist>
的不同名称空间此命名空间包含ontology
而不是property
- ontology
是用于对象属性的名称空间。