Below is the data set I have:
: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
Use case:
Need to fetch attributes committed in each revision.
- If the user asks for :revision#1
, A1
should be returned.
- If the user asks for :revision#2
, A1
and A2
should be returned.
- If the user asks for :revision#3
, only A2
should be returned as A1
is :reverted
in :revision#3
.
The closest query I could come up with is below which is not working:
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) )
}
Actual Output:
A1 & A2
Expected Output:
A2
I understand the issue. Not able to come up with a proper query. Can any of you please help.
Thanks in advance.
Make use of different variable in the FILTER NOT EXISIT, e.g.
Edit: after the additional comment from @Linz and adding a filter to look only for revisions with smaller revison numbers.