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

标签 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

但我想将结果限制为这样的第一级 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/

相关文章:

sparql - 使用 dotnetRDF 查询 dbpedia sparql 端点 - RDFParseException

sparql - 如何按限定符显示或过滤?

rdf - 是否可以将这 2 个 SPARQL 更新查询合并为一个?

rdf - sparql 查询中三元组的顺序会影响结果吗?

c# - 为什么这个 System.IO.Pipelines 代码比基于 Stream 的代码慢得多?

sparql - 将 bnode 转换为 graphdb 中的字符串

c# - 更新字典的值,该值本身就是另一个字典的值

c# - 如何将数据从 Sql 对象复制到 C# 模型属性

c# - 带有 ASP.NET Core 的 SignalR 不使用 websockets 但使用长轮询

c# - 安装完成后如何运行批处理脚本?