2009-10-23 21 views
10

我想寫一個SPARQL查詢應該給我所有foaf:Agents這不是foaf:PersonsSPARQL否定:所有foaf:非foaf的代理:人員

我看不到一種將this OPTIONAL/BOUND construct應用於此問題的方法,因爲所有屬性(如rdfs:subClassOfrdf:type)都是傳遞和反射的。

我嘗試這樣做:

SELECT * WHERE { 
?x rdf:type foaf:Agent 
OPTIONAL { ?y rdf:type foaf:Person } 
FILTER (!BOUND(?y)) } 

但RDF:類型似乎是傳遞,至少JENA/ARQ/SDB。

回答

10

這不起作用的原因是因爲您有兩個單獨的變量綁定(?x?y),它們與您的查詢無關。所以?x必須綁定在結果集中(這是你想要的),但如果?y沒有綁定,你還沒有學到任何關於?x的新知識。

更新:在理想的查詢中,根本不需要?y;您可以直接測試?x的傳入/傳出edegs。當你想要檢查給定的變量綁定中是否存在一條邊時,這很難(不可能)在SPARQL 1.0中完成。然而,SPARQL 1.1將提供支持否定:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT ?agent 
WHERE 
{ 
    ?agent rdf:type foaf:Agent . 
    NOT EXISTS { ?agent rdf:type foaf:Person . } 
} 

@Kingsley Idehen的做法(使用第三方SPARQL擴展)可以幫助你在短期內解決這個問題。

+0

但我怎麼設置X和Y之間的關係?? – 2009-10-24 12:16:45

+0

SPARQL 1.1肯定會否定,ISWC 2009上的工作組面板明確表示 – RobV 2009-10-29 21:58:19

+0

請注意,SPARQL 1.1語法(如鏈接中指定的)現在實際上是「FILTER NOT EXISTS」(需要FILTER關鍵字前面) – 2017-05-11 00:47:09

1

通過炫技SPARQL擴展 端點驗證 http://lod.openlinksw.com/sparql(LOD雲緩存實例)

SELECT DISTINCT×○

WHERE {

X一個FOAF:???代理。 ?x?p?o。 濾波器(BIF:存在((選擇(1)其中{XA的foaf:人})))

}

極限10

DESCRIBE X

WHERE {

?xa foaf:Agent。

濾波器(BIF:存在((選擇(1)其中{XA的foaf:人}))) }

限200

8

要SPARQL 1.0做到這一點,你必須要做:

SELECT * WHERE { 
    ?x rdf:type foaf:Agent 
    OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . } 
    FILTER (!BOUND(?y)) 
} 

正如菲爾M.說,SPARQL 1.1將引入新的語法,使這更直接寫入。

+0

你的解決方案拯救了我的一天!謝謝! – 2011-05-24 13:17:02

相關問題