12

私はSPARQLクエリを書き込もうとしていますfoaf:Agentsが、そうでないものはすべて得られるはずfoaf:Personsです。

このOPTIONAL/BOUND構造をこの問題に適用する方法がわかりません。これは、のようなすべてのプロパティが推移的rdfs:subClassOfrdf:type反射的であるためです。

私はこれを試しました:

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

しかし、rdf:typeは、少なくともJENA / ARQ / SDBでは、推移的であるように見えます。

4

5 に答える 5

13

これが機能しない理由は、クエリで無関係な2つの別個の変数バインディング(?xおよび)があるためです。?yしたがって?x、結果セットに表示されるようにバインドする必要があります(これは必要なものです)が、?yバインドされていない場合は、について新しいことは何も学習していません?x

更新:理想的なクエリでは、まったく必要ありません?y?xの着信/発信エッジを直接テストできます。特定の変数バインディングにエッジが存在しないかどうかを確認したい場合、SPARQL 1.0でこれを行うのは困難です(不可能ですか?)。ただし、SPARQL1.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 .
    FILTER NOT EXISTS { ?agent rdf:type foaf:Person . }
}

@Kingsley Idehenのアプローチ(サードパーティのSPARQL拡張機能を使用)は、短期的に問題を解決するのに役立つはずです。

于 2009-10-23T21:19:00.523 に答える
9

SPARQL 1.0でこれを行うには、次のように記述する必要があります。

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

Phil Mが言うように、SPARQL 1.1は、これをはるかに簡単に記述できるようにするための新しい構文を導入します。

于 2009-10-25T01:04:53.407 に答える
2

検証のためのVirtuosoSPARQLExtensionsエンドポイント経由 http://lod.openlinksw.com/sparql(LODクラウドキャッシュインスタンス)

SELECT distinct ?x ?o 
WHERE { 
?x a foaf:Agent .
?x ?p ?o.
filter (!bif:exists ((select (1) where { ?x a foaf:Person } ))) 
} 
limit 10
DESCRIBE ?x 
WHERE { 
?x a foaf:Agent .
filter (!bif:exists ((select (1) where { ?x a foaf:Person } ))) 
} 
limit 200 
于 2009-10-24T14:32:46.377 に答える
2

否定の(ドラフト)SPARQL 1.1仕様は次のとおりです:http ://www.w3.org/TR/sparql11-query/#negation

于 2011-09-06T09:13:01.997 に答える
2

SPARQL 1.1のおかげで、以下が機能するようになりました。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
SELECT DISTINCT COUNT(?agent)
WHERE 
{
    ?agent rdf:type foaf:Agent .
    FILTER (NOT EXISTS { ?agent rdf:type foaf:Person . })
}

ライブサンプルリンク:

  1. クエリソリューション

  2. クエリ定義

于 2013-04-13T16:39:54.100 に答える