2017-08-03 55 views
-1

我需要提取关于位于给定类别(例如,历史)的不同嵌套子类别上的文章(例如抽象,缩略图)的信息。 如何使用SPARQL查询来执行此操作?或者,用几个SPARQL子查询在python上做到这一点的最佳方式是什么?如何使用dbPedia递归地提取子类别中的所有文章?

+0

例如,我对历史类别感兴趣。该类别具有子类别,每个子类别具有子类别等等。我想从历史的不同级别的子类别中检索所有文章。 PREFIX DCT: 选择x WHERE?{X的DCT:受试者 } – sermal

+0

请编辑你的问题,并把查询(Markdown格式化) - 不在评论 – AKSW

+1

子类别可以通过使用'skos:更广泛'resp。 'skos:narrowr'关系。请注意,应该限制遍历的深度,因为如果类别层次结构太大,它可能会过于昂贵 – AKSW

回答

4

这得到所有?sc“子类别”是递归(或及物动词)窄于“历史”,高达3的深度我实施了与{minDepth,maxDepth}表示法炫技理解。其他三重商店可能不理解它。我还在字符串文字上添加了英语语言过滤功能,同时仍然保留了带有IRI的三元组?o

SELECT ?sc ?lab ?p ?o 
WHERE { 
    ?sc skos:broader{1,3} <http://dbpedia.org/resource/Category:History> . 
    optional {?sc rdfs:label ?lab } . 
    ?sc ?p ?o 
    filter (lang(?lab) = "en") 
    filter ((lang(?o) = "en") || isURI(?o)) 
} 

此外,该查询报告与?sc作为主题的所有三元组。我没有看到任何摘要(使用<http://dbpedia.org/ontology/abstract>作为谓词?)或任何缩略图关系。您可以确认仅distinct ?p突出,甚至计数:

SELECT ?p (count(?p) as ?pcount) 
WHERE { 
    ?sc skos:broader{1,3} <http://dbpedia.org/resource/Category:History> . 
    optional {?sc rdfs:label ?lab } . 
    ?sc ?p ?o 
    filter (lang(?lab) = "en") 
    filter ((lang(?o) = "en") || isURI(?o)) 
} 
group by ?p 
order by desc(?pcount) 

如果你这样做更深层次的递归,你会发现一些摘要。但深层递归很慢,我觉得我在概念上缺少一些东西。

SELECT * 
WHERE { 
    ?sc skos:broader{5,7} <http://dbpedia.org/resource/Category:History> . 
    ?sc <http://dbpedia.org/ontology/abstract> ?a 
} 
+1

确实如此。有一点需要注意,在属性路径中使用'property {n,m}'是非标准的SPARQL语法,只是Virtuoso的扩展。它已在[提交阶段](https://www.w3.org/TR/sparql11-property-paths/)中讨论过,但遗憾的是从未提交给官方[W3C推荐](https://www.w3.org/TR/sparql11查询/#propertypaths)。干杯 – AKSW

+0

谢谢!第一个查询非常接近目标。我如何为“en”添加过滤器?列“p”包含带“@en”的值,但最后一列包含当前不同语言的行。 – sermal

+0

感谢您的反馈。你是什​​么意思“p”列包含“en”的值? p是谓词,而不是语言型文字。我已经更新了关于实验室和?o的过滤的答案。请注意,这将隐藏?sc?p?o关系,其中?o是IRI,而不是文字。例如,这可能会隐藏缩略图图像的网址。 –

相关问题