繁体   English   中英

RDF SPARQL查询 - 查找不属于这两个条件的元组(SQL中的LEFT JOIN)

[英]RDF SPARQL Query - Find tuples that are not part of both conditions (LEFT JOIN in SQL)

以下是我拥有的数据集:

:project#1   :hasRevision        :revision#1
:revision#1  :hasRevisionNumber  1 
:project#1   :hasRevision        :revision#2
:revision#2  :hasRevisionNumber  2
:project#1   :hasRevision        :revision#3
:revision#3  :hasRevisionNumber  3
:revision#1  :committed          :A1
:A1          :hasId              1
:revision#2  :committed          :A2
:A2          :hasId              2
:revision#3  :reverted           :A1

使用案例:

需要获取每个修订中提交的属性。
- 如果用户要求:revision#1 ,则应返回A1
- 如果用户要求:revision#2 ,则应返回A1A2
- 如果用户要求:revision#3 ,则只应返回A2因为A1:reverted:revision#3

我能提出的最接近的查询是在下面哪个不起作用:

select ?attribute ?id WHERE { 
    :project1  :hasRevision       ?revision . 
    ?revision  :hasRevisionNumber ?revNum ; 
               :committed         ?attribute . 
   ?attribute  :hasId             ?id . 
   FILTER NOT EXISTS { ?revision :reverted ?attribute } 
   FILTER ( ( ?revNum <= 3 && ?revNum > 0 ) && ?id in (1,2) ) 
}

实际产量:

A1 & A2 

预期产出:

A2

我理解这个问题。 无法提出正确的查询。 你们中的任何人都可以帮忙吗

提前致谢。

在FILTER NOT EXISIT中使用不同的变量,例如

FILTER NOT EXISTS { ?otherRevision :reverted ?attribute } 

编辑:在@Linz的附加注释之后添加过滤器以仅查看具有较小修订号的修订。

prefix : <http://base.org/>
select ?attribute ?id WHERE { 
    bind (3 as ?targetRevisionNum )
    :project1  :hasRevision       ?revision . 
    ?revision  :hasRevisionNumber ?revNum ; 
               :committed         ?attribute . 
   ?attribute  :hasId             ?id . 
    FILTER NOT EXISTS { 
        ?other :reverted ?attribute . 
        ?other :hasRevisionNumber ?otherRevNum .
        filter (?otherRevNum <= ?targetRevisionNum )
    } 
   FILTER ( ( ?revNum <= ?targetRevisionNum && ?revNum > 0 ) && ?id in (1,2) ) 
}

找到了解决方法。
对象可以是:committed:reverted:reverted一次。 因此,使用having与聚合函数过滤器的基础上,从“关系的计数revision ”到“ object ”啊,我的最终查询如下:

prefix : <http://test.org/> 

select  ?attribute WHERE { 

        :project1  :hasRevision       ?revision . 
        ?revision  :hasRevisionNumber ?revNum ; 
                   ?s   ?attribute .
        ?attribute :hasId ?id;
        FILTER ( ( ?revNum <= 3 && ?revNum > 0 ) && ?id in (1,2) )  

}  
group by ?attribute 
having (count(?attribute) < 2 )

输出:

attribute
<http://test.org/A2>

如果有人能找到更好的查询,我会很高兴。 谢谢大家!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM