我正在使用C#对我的N3数据文件执行查询。如何将结果限制为节点的第一级子节点。 例如:
project
|
|__ main
| |__m1
| |__m2
|
|__ SUB
|__A
| |__A1
| |__A2
|
|__B
|__C
| |__C1
|
|__D
一个示例查询,它会生成SUB的所有节点级别:
select ?object where {
:SUB rdfs:superClassOf* ?object
}
结果将是:
|__A
| |__A1
| |__A2
|
|__B
|__C
| |__C1
|
|__D
但是我想把结果限制在这样的第一级孩子:
|__A
|__B
|__C
|__D
答案 0 :(得分:6)
使用*
的属性路径查找长度为zeor或更大的路径。如果您想要长度恰好为1的路径,请删除*
:
select ?object where {
:SUB rdfs:superClassOf ?object
}
我注意到RDFS只定义了您在查询中使用的rdfs:subClassOf
,而不是rdfs:superClassOf
。不过,我会认为这只是问题的一个错字。我认为你想要的实际查询是:
select ?subclass where {
?subclass rdfs:subClassOf :SUB
}
本节中的解决方案基于an answer to a question about finding the position of elements in an RDF list。考虑这些数据:
@prefix : <urn:ex:> .
:a :p :b, :c .
:b :p :d, :e .
此查询查找p
上的链以及链的长度:
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 |
------------------------
因为我们可以获得路径的长度,我们可以filter
在该长度上获得我们想要的路径。例如:
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 |
-------------
当您只想要小但特定长度的路径时,可以手动展开属性路径。例如,对于长度为2的路径:
prefix : <urn:ex:>
select ?sub ?sup {
?sub :p/:p ?sup .
}
对于一系列数字,例如1-2,您可以使用匹配零或一的?
:
prefix : <urn:ex:>
select ?sub ?sup {
?sub :p/:p? ?sup .
}
有关属性路径的更多信息,请务必查看SPARQL 1.1规范中的9 Property Paths部分。