rdf - 使用 SPARQL 查询的 UNION 和交集

标签 rdf sparql jena arq redland

我正在将用户定义的查询转换为 SPARQL。例如,当用户说“abc”时,这意味着给我给定类型的所有节点,这些节点具有名为“abc”的属性。作为对此的扩展,如果用户说“abc 或(pqr 和 lmn)”,我需要找到某个属性为“abc 或(pqr 和 lmn)”的给定类型的所有节点。以下是我提出的查询:

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"))

最佳答案

我将您的查询具体化如下(为第一个过滤器输入明确的类型):

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:

$ 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

关于rdf - 使用 SPARQL 查询的 UNION 和交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10146576/

相关文章:

rdf - 在 rdf 文档上运行 SPARQL 时没有结果

SPARQL 将 "."替换为 "_"

sparql - DBpedia SPARQL 和谓词连接

rdf - 将 Notation3 加载到数据库中

java - 使用 Sesame 或 Apache Jena 通过套接字发送 RDF/XML

html - 将 HTML 转换为 RDF

java - 将RDF格式字符串写入芝麻存储库

java - 读取 Jena 模型时出现错误 URI 异常

tree - 检索 rdf :Class 的所有祖先

java - Jena 结果集为字符串