将SPARQL查询结果限制为层次结构中的第一级

时间:2013-08-08 13:10:35

标签: c# sparql

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

1 个答案:

答案 0 :(得分:6)

选择长度为1的路径

使用*的属性路径查找长度为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部分。