4

我正在使用 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
4

1 回答 1

6

选择长度为 1 的路径

属性路径 using*查找长度为 zeor 或更大的路径。如果您想要长度正好为 1 的路径,只需删除*

 select ?object where { 
   :SUB rdfs:superClassOf ?object
 }

我会注意到,RDFS 仅定义rdfs:subClassOf,而不是rdfs:superClassOf您在查询中使用的定义。不过,我会假设这只是问题中的一个错字。我认为您想要的实际查询是:

select ?subclass where { 
  ?subclass rdfs:subClassOf :SUB
}

选择任意长度的路径

本节中的解决方案基于对有关在 RDF 列表中查找元素位置的问题的回答。考虑以下数据:

@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 节属性路径

于 2013-08-08T14:26:36.533 回答