2009-10-23 1 views
10

私はすべてfoaf:Agentsfoaf:PersonsではないSPARQLクエリを作成しようとしています。SPARQL否定:すべてfoaf:foafではないエージェント:Person

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

私はこれを試してみました:

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

しかし、RDF:タイプは、少なくともJENA/ARQ/SDBで、推移的であると思われます。

答えて

10

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

更新:理想的なクエリでは、?yはまったく必要ありません。着信/発信エデグを?xに直接テストすることができます。これは、特定の変数バインディングにエッジが存在しないかどうかをチェックしたいときに、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の拡張機能を使用して)。検証 http://lod.openlinksw.com/sparqlため

+0

しかし、私は、xとyとの関係設定するのですか?を? ? –

+0

SPARQL 1.1は間違いなく、ISWC 2009のワーキンググループのパネルで明確に否定されています – RobV

+0

SPARQL 1.1の構文(リ​​ンクで指定されています)は実際には 'FILTER NOT EXISTS'です(' FILTER'のキーワードが必要ですフロント) –

1

経由のVirtuoso SPARQLの拡張 エンドポイント(LODクラウドキャッシュ・インスタンス)

明確なSELECT X

{

oをFOAF×:???エージェント。 ?x?p?o。 フィルタ

}

限界10

DESCRIBE X

WHERE {

(BIFは:!:{?人のXA FOAFは}))(((1)ここで、選択存在します)?

?xa foaf:エージェント。

フィルタ(BIF:!{?XA FOAF:人}(1)を選択し((存在)))SPARQL 1.0でこれを行うには }

上限200

8

を、あなたは持っているだろうPhil Mは、SPARQL 1.1では、これをはるかに簡単に書くための新しい構文を導入する予定です。

リー

+0

あなたのソリューションは私の一日を保存しました!ありがとうございました! –

関連する問題