SPARQL - 使用过滤条件提取图的子集

SPARQL - extract subset of graph with filter conditions

我正在尝试提取具有多层次结构的图的子集。

示例结构:

                                         root
                                   /                     \ 
                               SubWant                   subNotWant
                             /         \                           \
                     childWant        childWant                   gCWant
                        /                 \
                       gCWant       gCNotWant
                      /
                   gGCWant

subWant 子树是我想要得到的(假设所有 {'/','\'} 或 broader/narrower 关系)

我当前的查询是:

CONSTRUCT
{
  ?children a skos:Concept ;
    skos:broader ?parent ;
    skos:prefLabel ?childPrefLiteral .
   }  

    WHERE {
    ?children skos:broader+ <http://example.com#subWant> ;
        skos:prefLabel ?childPrefLiteral .

    filter(STRBEFORE(?childPrefLiteral, " ") NOT IN (<criteria to prune by>) )
    ?children skos:broader ?parent ;


    # filter parent to only have transitive broader relation to desired concept

    ?parent skos:broader+ <http://example.com#subWant>
  }

除了不包括 subWant 节点的直接子节点外,该查询几乎可以正常工作。关于如何优雅地完成此任务的任何建议?请注意最后一个三元组 ?parent skos:broader <http://example.com#subWant> 的原因是必要的,因为节点有多个父节点(多层次结构)- 请参阅示例图中的 gCWant 节点。

尝试改变

?parent skos:broader+ <http://example.com#subWant>

进入

?parent skos:broader* <http://example.com#subWant>

“*”和“+”的区别在于“*”也匹配 ?parent<http://example.com#subWant> 的结果。