我可以创建一个遍历链接并递归返回某些信息的SPARQL语句吗



我对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结果

最新更新