2017-07-14 27 views
1

在dbpedia中,我選擇了一些標籤開始'A'的頁面。在這裏我使用主題的附加過濾器來縮小集合。在原來的版本也有另一種情況(結果集是更大)sparql排除多種類型的層次結構

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

這裏我只選擇頁面類型爲與問題的其餘部分明確。 這是整套。現在我想排除一些頁面。排除所有代理(個人,組織等):

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。我嘗試了不同的方法,但無法找到正確的方法。

這將返回什麼:

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 } 
    } 

的問題是: 我應該去什麼樣的方式來排除特定類型的網頁(直接和超類)?

回答

2

它看起來是這樣的工作答案(如何排除類型的倍數)

{ 
     ?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:代理,DB:鄰居,DBO:作品將被過濾掉。

+0

用'FILTER NOT EXISTS {?page a dbo:Agent}'取代'MINUS {?page a dbo:Agent}'也可以。 – AndyS

+0

是的,它適用於單一類型排除。在我的情況下,它並沒有幫助 – Chpokeridze