【发布时间】:2022-08-25 18:54:01
【问题描述】:
构造查询应该显示特定的层次结构。从我的叶子对象开始(向上)直到我的根对象(公司)。 但是,它的作用是,如果我从叶节点开始,迭代到下一个,那么所有模式“?prev skos:broader ?next”都是允许的。这意味着我有一片叶子,上一层(机器),在我的起始叶子旁边,我看到多个其他叶子(其他机器组件),它们是有效的但不想要.
construct {
?start a :Start . #start node
?prev # declare the previous variable
skos:broader ?next ; # hierarchy iteration
a ?prevType ; # return type
rdfs:label ?prevName ; #label of the asserted node
.
?next
a ?nextType ;
rdfs:label ?nextName ;
.
}
WHERE
{
GRAPH (named graph)
{
values ?start { <IRI> } #leaf node
?start skos:broader+ ?next .
?prev
skos:broader ?next ;
a ?prevType ;
rdfs:label ?prevName ;
.
?next
a ?nextType ;
rdfs:label ?nextName ;
bind(localname(?prevType) as ?prevTypeName)
bind(localname(?nextType) as ?nextTypeName)
}
Pic1: Problem of tripples at the same level
所以,在我的 WHERE 末尾,我尝试添加一个 EXIST 过滤器。目的是仅过滤从我的起始节点开始的模式,并忽略该直接路径之外的所有其他模式。 此查询显示我想要的但跳过第一个 skos:borader 关系。所以我有我的离开节点(组件)(rdf:type Start),但是层次结构(机器)中的下一个节点缺少“skos:borader”。但是从那里正确返回所有其他层次结构(直到公司)。这只是第一跳
大问题,我如何声明我的开始是正确的,所以我的 L2 节点的第一个 skos:borader 被正确断言?
WHERE
{
GRAPH (named graph)
{
values ?start { <IRI> } #leaf node
?start skos:broader+ ?next .
?prev
skos:broader ?next ;
a ?prevType ;
rdfs:label ?prevName ;
.
?next
a ?nextType ;
rdfs:label ?nextName ;
bind(localname(?prevType) as ?prevTypeName)
bind(localname(?nextType) as ?nextTypeName)
}
#PRUPOSE: from all valid skos:borader defined in the construct part abouve -> filter out only the direct paths at each level which derive from ?start directly
Filter EXISTS {
?start skos:broader+ ?prev .
?prev skos:broader ?next }
}
【问题讨论】:
标签: sparql rdf hierarchy rdfs construct