sparql 排除多个类型层次结构

sparql exclude multiple type hierarchy

在 dbpedia 中,我 select 一些页面的标签以 'A' 开头。在这里,我通过主题使用额外的过滤器来缩小集合。在原始版本中还有另一个条件(结果集更大)

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX purl: <http://purl.org/dc/terms/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX : <http://dbpedia.org/page/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX dbr: <http://dbpedia.org/resource/>

SELECT DISTINCT 
   ?pageType
WHERE
{ 
   {
       ?page rdfs:label ?label .
       ?page a ?pageType .
       ?page <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Banking> .
   }

   FILTER ( strstarts(str(?pageType), 'http://dbpedia.org/ontology') )
}

LIMIT 1000

sparql results

这里我select只有页面类型要清楚,其余问题。 这是整套。现在我想排除一些页面。排除所有代理人(人员、组织等):

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX purl: <http://purl.org/dc/terms/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX : <http://dbpedia.org/page/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX dbr: <http://dbpedia.org/resource/>

SELECT DISTINCT 
   ?pageType
WHERE
{ 
   {
       ?page rdfs:label ?label .
       ?page a ?pageType .
       ?page <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Banking> .

       MINUS { ?page a dbo:Agent }
   }

   FILTER ( strstarts(str(?pageType), 'http://dbpedia.org/ontology') )
}

LIMIT 1000

The result.

好的。然后我想排除更多类型,例如Written_Work。我尝试了不同的方法,但找不到正确的方法。

这个returns没什么:

WHERE
{ 
   {
       ?page rdfs:label ?label .
       ?page a ?pageType .
       ?page <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Banking> .

       MINUS { ?page a dbo:Agent }
       MINUS { ?page a dbo:WrittenWork }

   }

这就像没有设置过滤器:

WHERE
{ 
   {
       ?page rdfs:label ?label .
       ?page a ?pageType .
       ?page <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Banking> .

       MINUS { ?page a dbo:Agent, dbo:WrittenWork }
   }

问题是: 我应该用什么方法来排除某些类型的页面(直接和超类)?

看起来这是可行的答案(如何排除多种类型)

  {
       ?page purl:subject ?id .
       ?page a ?pageType .

       FILTER NOT EXISTS {
        ?page a/rdfs:subClassOf* ?skipClasses .
        FILTER(?skipClasses in (dbo:Agent, dbo:Place, dbo:Work))
       }

   }

在此示例中,将过滤掉所有 dbo:Agents、db:Places、dbo:Works。