2012-04-13 103 views
2

我將用戶定義的查詢轉換爲SPARQL。例如,當用戶說「abc」時,它意味着給我一個給定類型的所有節點,它們有一些名爲「abc」的屬性。作爲這個的擴展,如果用戶說「abc或(pqr和lmn)」,我需要找到某個屬性爲「abc或(pqr和lmn)」的給定類型的所有節點。以下是我已經提出的查詢:使用SPARQL查詢進行聯合和交集

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 2012-04-13 20:49:45

+0

每個術語可能會更復雜,使得{}的主體更大,並且這些術語將與這些基本案例混合在一起。 FILTER只適用於這種情況。 – 2012-04-13 23:26:02

+0

另外,我發現上面的查詢不適用於Redland。然後我嘗試安裝ARQ,並對其進行處理。所以,它可能與那個特定的實現有關。 – 2012-04-13 23:28:10

回答

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 ARQRedland based roqet運行這個,我在這兩種情況下都得到了這些規則。

隨着ARQ:

$ 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

$ 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