2012-04-13 102 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