[英]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
,则应返回A1
和A2
。
- 如果用户要求: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.