2017-05-30 31 views
0

我有一个内部三元组数据集。Sparql - 遍历顶部(最宽)

我正在尝试为使用数据集的应用程序实现一个typeahead功能。

我试图找出我怎么能遍历有条件的热门概念

enter image description here

在这张图片中,如果我搜索了梦工厂,这将是3层向下(商业组织 - >私人公司 - >梦工厂)。

如果我做了其他的事,显然它会在图的不同层次上。

我试图将“组织”或“人物”的价值作为最高等级。

这非常简单的查询工作。

 SELECT DISTINCT ?subjectPrefLabel ?a ?b ?o 
    WHERE 
     { 
      ?subject skosxl:prefLabel/skosxl:literalForm ?subjectPrefLabel . 
    ?subject skos:broader/skos:broader/skos:broader/skosxl:prefLabel/skosxl:literalForm ?a 


    FILTER regex(?subjectPrefLabel, "Dreamworks", 'i') 
     } 
    ORDER BY ?subjectPrefLabel 

enter image description here

然而,显然这是不可持续的,因为开发人员需要了解才能发出的skos:broader正确数量的多少级向下的层次结构。

无论如何,我可以有条件地发现层次结构的最高级别?因为这是一个内部本体,我不能共享任何数据,所以我知道这将是很难与任何建议,赞赏。

回答

1

使用克林星运营商* incombination与FILTER没有更广泛的概念应该只返回顶部的概念:

SELECT DISTINCT ?subjectPrefLabel ?a ?b ?o WHERE { 
    ?subject skosxl:prefLabel/skosxl:literalForm ?subjectPrefLabel . 
    ?subject skos:broader* ?concept. 
    ?concept skosxl:prefLabel/skosxl:literalForm ?a 
    FILTER NOT EXISTS { ?concept skos:broader ?supConcept } 
    FILTER regex(?subjectPrefLabel, "Dreamworks", 'i') 
} 
ORDER BY ?subjectPrefLabel