2010-07-21 39 views
3

我做的DBpediaset一个SPARQL查询,但我有一些问题(由于缺乏详细的SPARQL知识)与查询的限制:SPARQL SKOS:更广泛的

我第一次“得到”的所有音乐艺术家:

?person rdf:type <http://dbpedia.org/ontology/MusicalArtist> . 

但我想这个限制更广泛Category:American_musicians类别(通过遍历skos:broader):怎么样?

* =而问题是具体的,我想运行SPARQL查询时遇到的这个任务很多次。

+1

我想你会想要一个sparql引擎与推理做到这一点,理论上引擎可以知道broarder是transative和perfrom查询。然而,这不是标准的东西。 – 2010-07-26 14:13:03

回答

1

有这样做没有真正的好办法,但这里有一个详细的方法:

SELECT DISTINCT (?person) 
WHERE 
{ 
    ?person rdf:type dbpedia-owl:MusicalArtist . 
    { 
    ?person skos:subject [ skos:broader category:American_musicians ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader category:American_musicians ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] ] ] ] . 
    } 
} 

搞清楚有多少水平,你需要,你可以改变SELECT DISTINCT到SELECT COUNT DISTINCT和停止添加水平时计数停止上升。

0

这在neo4j中很容易执行。在SPARQL中完成任务的替代方案可能是通过迭代子类别上的代码来提取“Category:American_musicians”下的所有子图。

例如,在java中的伪代码将是这样的:

String startCategory = "<http://dbpedia.org/resource/Category:American_musicians>"; 
iterateTraversalFunction(startCategory); 

然后穿越功能是:

public void iterateTraversalFunction(String startCategory){ 
    ArrayList<String> artistsURI = // SPARQL query ?person skos:subject startCategory . ?person rdf:type MusicalArtist 

    ArrayList<String> subCategoriesURI = // SPARQL query ?subCat skos startCategory 
    // Repeat recursively 
    for(String subCatURI: subCategoriesURI){ 
     iterateTraversalFunction(subCatURI); 
    } 
} 

希望这有助于 - 丹

4

这可以在作出与物业的路径更容易SPARQL 1.1

SELECT DISTINCT (?person) 
WHERE 
{ 
    ?person rdf:type dbpedia-owl:MusicalArtist . 
    ?person skos:subject skos:broader* category:American_musicians . 
} 

这里它显示所有祖先可能b e通过skos:broader属性达到。

+0

我在哪里可以找到SPARQL 1.1 DBpedia端点?我试着把查询放入snorql,但失败了:http://dbpedia.org/snorql/?query=SELECT+DISTINCT+%28+%3Fperson+%29%0D%0AWHERE%0D%0A%7B%0D%0A++%3Fperson + rdf%3Atype + dbpedia-owl%3AMusicalArtist +。%0D%0A ++%3Fperson + skos%3Asubject ++ skos%3Abroader * + category%3AAmerican_musicians ++。%0D%0A%7D – dranxo 2014-02-19 20:40:57

1

我很惊讶这个简单的问题尚未在3年内正确回答,有多少不确定性和怀疑的人传播。

SELECT * { ?person a dbo:MusicalArtist . filter exists {?person dct:subject/skos:broader* dbc:American_musicians} }

  • 修正了几个前缀:dbo,而不是长期dbpedia-owldbc而不是category。这些短前缀内建到DBpedia中
  • 校正skos:subject(没有这样的道具存在)到dct:subject
  • 校正与属性路径的查询时,它缺少/
  • skos:broader不传递的,skos:broaderTransitive是。然而,DBpedia中没有后者(没有传递推理)
  • 更换DISTINCT这与FILTER EXISTS昂贵的是要快得多。 FILTER可停在它找到的第一个相关子类别,而原始查询首先为每个艺术家找到所有这样的子猫,然后丢弃它们(DISTINCT),排序内存中的艺术家并删除重复。
+0

FWIW一些答案是5岁。我相信当时DBPedia端点对财产路径的支持非常不全面。 – 2017-01-25 07:36:26