2012-04-13 11 views
2

私はユーザ定義クエリをSPARQLに変換しています。例えば、ユーザが "abc"と言うと、 "abc"という名前の属性を持つ与えられた型のすべてのノードを私に渡すことを意味します。これを拡張して、ユーザが "abcまたは(pqrとlmn)"と言うと、属性が "abcまたは(pqrとlmn)"である特定の型のすべてのノードを見つける必要があります。以下は私が思いついた質問です:SPARQLクエリを使用するUNIONと交差

SELECT DISTINCT ?node, ?type             
WHERE                   
{ 
    {                    
    ?node a ?type .               
    FILTER (?type != <sometype>) 
    } 
{   
    {                    
    ?node ?reln0 ?obj0 .              
    FILTER (regex(str(?obj0), 'abc', "i"))       
    }                    
    UNION                   
    {                    
    {                    
     ?node ?reln1 ?obj1 .              
     FILTER (regex(str(?obj1), 'pqr', "i"))         
    } 
    {                    
     ?node ?reln2 ?obj2 .              
     FILTER (regex(str(?obj2), 'lmn', "i"))        
    }                    
    } 
}                    
}                    
ORDER BY ?node 

しかし、それは適切な結果を返しません。上記の質問に何か問題はありますか?条件を動的に生成する必要があるため、各節を別々にする必要があるため、以下を使用する必要はありません。

FILTER (regex(str(?obj2), 'abc', "i") || regex(str(?obj2), 'pqr', "i") && regex(str(?obj2), 'lmn', "i")) 
+0

あなたは一つの大きな 'FILTER'と第二のアプローチを使用していない理由を私は理解していません。それは簡単で動作します。 – cygri

+0

それぞれの用語はより複雑になり、{}の本体が大きくなり、これらの基本的なケースと混合されます。 FILTERはこの場合にのみ機能します。 –

+0

また、上記のクエリはRedlandでは動作しないことがわかりました。その後、私はARQをインストールしようとしました。したがって、それはその特定の実装に関連している可能性があります。 –

答えて

1

私は次のように(最初のフィルタのための明確なタイプに入れて)クエリコンクリートを作った:私は、次のデータ生成

PREFIX : <http://example.org/> 

SELECT DISTINCT ?node ?type             
WHERE                   
{ 
    {                    
     ?node a ?type .               
     FILTER (?type != :Type1) 
    } 
    {   
     {                    
      ?node ?reln0 ?obj0 .              
      FILTER (regex(str(?obj0), 'abc', "i"))       
     }                    
     UNION                   
     {                    
      {                    
       ?node ?reln1 ?obj1 .              
       FILTER (regex(str(?obj1), 'pqr', "i"))         
      } 
      {                    
       ?node ?reln2 ?obj2 .              
       FILTER (regex(str(?obj2), 'lmn', "i"))        
      }                    
     } 
    }                    
}                    
ORDER BY ?node 

@prefix : <http://example.org/> . 

:n1 a :Type2 ; # keep 
    :r0 :NodeABC . 

:n2 a :Type2 ; 
    :r0 :NodeBCD . 

:n3 a :Type2 ;  # keep 
    :r1 :NodePQR ; 
    :r2 :NodeLMN . 

:n4 a :Type2 ; 
    :r1 :NodeQRS ; 
    :r2 :NodeLMN . 

:n5 a :Type2 ; 
    :r1 :NodePQR ; 
    :r2 :NodeMNO . 

:n6 a :Type2 ; 
    :r1 :NodeQRS ; 
    :r2 :NodeMNO . 

のみ:n1をし、 :n3を保管してください。 Jena's command line ARQ、またはRedland based roqetでこれを実行することができます。どちらの場合でもこれらのルールが適用されます。 ARQで

roqet

$ arq --data data.n3 --query query.sparql 
----------------- 
| node | type | 
================= 
| :n1 | :Type2 | 
| :n3 | :Type2 | 
----------------- 

$ arq --version 
Jena:  VERSION: 2.10.0 
Jena:  BUILD_DATE: 2013-02-20T12:04:26+0000 
ARQ:  VERSION: 2.10.0 
ARQ:  BUILD_DATE: 2013-02-20T12:04:26+0000 

$ roqet query.sparql -D data.n3 -r table 
roqet: Querying from file query.sparql 
-------------------------------------------------------------- 
| node      | type       | 
============================================================== 
| uri<http://example.org/n1> | uri<http://example.org/Type2> | 
| uri<http://example.org/n3> | uri<http://example.org/Type2> | 
-------------------------------------------------------------- 

$ roqet -v 
0.9.28