Limit the SPARQL query result to First level in hierarchy
c#, sparql
Solution
Selecting paths of length one
The property path using `*` finds paths of length zeor or greater. If you want paths of length exactly one, just remove the `*`:
select ?object where {
:SUB rdfs:superClassOf ?object
}
I'd note though that RDFS only defines `rdfs:subClassOf`, not `rdfs:superClassOf` which you've used in your query. I'll assume that it's just a typo in the question, though. I think the actual query you'd want would be:
select ?subclass where {
?subclass rdfs:subClassOf :SUB
}
Selecting arbitrary length paths
The solutions in this section are based on an answer to a question about finding the position of elements in an RDF list. Consider this data:
@prefix : <urn:ex:> .
:a :p :b, :c .
:b :p :d, :e .
This query finds chains on `p` along with the lengths of the chains:
prefix : <urn:ex:>
select ?sub ?sup (count(?mid)-1 as ?distance) where {
?sub :p* ?mid .
?mid :p* ?sup .
}
group by ?sub ?sup
order by ?sub ?sup
$ arq --data data.n3 --query query.sparql
------------------------
| sub | sup | distance |
========================
| :a | :a | 0 |
| :a | :b | 1 |
| :a | :c | 1 |
| :a | :d | 2 |
| :a | :e | 2 |
| :b | :b | 0 |
| :b | :d | 1 |
| :b | :e | 1 |
| :c | :c | 0 |
| :d | :d | 0 |
| :e | :e | 0 |
------------------------
Since we can get the length of the paths we can `filter` on that length and get just the ones we want. For instance:
prefix : <urn:ex:>
select ?sub ?sup where {
{
select ?sub ?sup (count(?mid)-1 as ?distance) where {
?sub :p* ?mid .
?mid :p* ?sup .
}
group by ?sub ?sup
order by ?sub ?sup
}
filter( ?distance = 2 )
# filter ( ?distance > 2 ) # alternative
# filter ( ?distance < 10 ) # alternative
}
$ arq --data data.n3 --query query.sparql
-------------
| sub | sup |
=============
| :a | :d |
| :a | :e |
-------------
When you just want paths of small, but specific length, you can expand the property path manually. E.g., for paths of length two:
prefix : <urn:ex:>
select ?sub ?sup {
?sub :p/:p ?sup .
}
For a range of numbers, e.g., 1–2, you can use the `?` which matches zero or one:
prefix : <urn:ex:>
select ?sub ?sup {
?sub :p/:p? ?sup .
}
For more about property paths, be sure to take a look at section 9 Property Paths in the SPARQL 1.1 specification.
Problem
I'm using C# to execute query on my N3 data files. How can i limit the result to the first level of children of a node. For example: ``` project | |__ main | |__m1 | |__m2 | |__ SUB |__A | |__A1 | |__A2 | |__B |__C | |__C1 | |__D ``` an example query which result all level of nodes for SUB: ``` select ?object where { :SUB rdfs:superClassOf* ?object } ``` the result will be: ``` |__A | |__A1 | |__A2 | |__B |__C | |__C1 | |__D ``` But i want to limit the result to the first level of children like this: ``` |__A |__B |__C |__D ```