我正在使用 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
但我想将结果限制为这样的第一级 child :
|__A
|__B
|__C
|__D
最佳答案
选择长度为1的路径
使用 *
的属性路径查找长度为 zeor 或更大的路径。如果您想要长度恰好为一的路径,只需删除 *
:
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 |
------------------------
因为我们可以获得路径的长度,所以我们可以根据该长度过滤
并只获得我们想要的路径。例如:
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 |
-------------
当您只需要较小但特定长度的路径时,您可以手动扩展属性路径。例如,对于长度为二的路径:
prefix : <urn:ex:>
select ?sub ?sup {
?sub :p/:p ?sup .
}
对于一系列数字,例如 1–2,您可以使用匹配零或一的 ?
:
prefix : <urn:ex:>
select ?sub ?sup {
?sub :p/:p? ?sup .
}
有关属性路径的更多信息,请务必查看 9 Property Paths 部分在 SPARQL 1.1 规范中。
关于c# - 将 SPARQL 查询结果限制为层次结构中的第一级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18126949/