我对SPARQL还很陌生,我想知道是否可以从一个URI开始,比如dbpedia.org/resource/Steve_Jobs,然后遍历链接到该起点的每个URI,返回他链接到的每个人的所有名字,并将其限制为50个答案?我本以为这是可能的,但我似乎在网上找不到任何资源(可能找错地方了)。因此,我想SPARQL查询将类似于蜘蛛,因为它在链接中爬行。
非常感谢您的帮助。
这取决于您到底需要什么。您不能在SPARQL中执行任意递归查询。例如,参见
- Sparql查询递归返回组成rdfs:class定义的所有三元组
- 有可能在SPARQL中表达递归定义吗
但是,您确实可以访问属性路径,其中可能包括重复。所以你可以做这样的事情:
select ?person where {
dbpedia:Steve_Jobs (<>|!<>)* ?person .
?person a dbpedia-owl:Person .
}
limit 10
这里的部分技巧是(<>|!<>)
充当属性通配符,因为每个属性要么是<>
,要么不是。我认为,这个查询应该大致符合您的要求。然而,Virtuoso的SPARQL端点不喜欢它,并返回错误:
Virtuoso 37000 Error SP031: SPARQL compiler: Variable '_::trans_subj_4_0' is used in the query result set but not assigned
SPARQL query:
define sql:big-data-const 0
#output-format:text/html
define sql:signal-void-variables 1 define input:default-graph-uri <http://dbpedia.org> select * where {
dbpedia:Steve_Jobs (<>|!<>)* ?person .
?person a dbpedia-owl:Person .
}
limit 10
查询捕获了您想要的内容,但您可能需要与Virtuoso开发人员核实,以确定如何使其工作。若你们不使用通配符属性,那个么你们会得到结果,所以若你们有一组你们关心的属性,你们可以使用它。例如,
select ?person where {
dbpedia:Steve_Jobs (dbpedia-owl:child|dbpedia-owl:influenced|^dbpedia-owl:child|^dbpedia-owl:influenced)* ?person .
}
limit 10
SPARQL结果