【问题标题】:How to isolate a list of URIs in a RDF file using CONSTRUCT or DESCRIBE in SPARQL?如何在 SPARQL 中使用 CONSTRUCT 或 DESCRIBE 隔离 RDF 文件中的 URI 列表?
【发布时间】:2018-07-20 11:03:22
【问题描述】:

我试图只获取 RDF 中的 URI 列表,而不是三元组列表:

PREFIX gr: <http://purl.org/goodrelations/v1#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

DESCRIBE  ?product 
WHERE
{
  ?product rdfs:subClassOf gr:ProductOrService .
}

使用SELECT,而不是DESCRIBE,我只收到主题(我想要的),但不是作为RDF,而是像带有绑定、变量等的SPARQL结果。

使用CONSTRUCT,我不能只指定?product,如上所述,所以我能得到的最接近的是:

PREFIX gr: <http://purl.org/goodrelations/v1#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

CONSTRUCT
WHERE
{
  ?product rdfs:subClassOf gr:ProductOrService .
}

它返回一个包含三元组不同产品但属性和对象相同的 RDF。

【问题讨论】:

  • RDF 大约是三元组。如果您需要 RDF,您将收到三元组(甚至四元组)。还是您想接收rdf:List 的 URI?
  • 一个 rdf:URI 列表。我就是这个意思!
  • 我建议你重写你的问题,也许让我们更好地了解你的最终目标,因为你所描述的想要的对于我们至少 3 个人阅读、评论和回答……就目前而言,我认为您可能正在处理XY Problem

标签: select sparql rdf


【解决方案1】:

将 SPARQL SELECT 查询的结果表示为 RDF 列表是一个工具问题 - 通常在 SPARQL 中无法解决。

一些 SPARQL 工具可能有方法支持将查询结果呈现为 RDF 列表。但这不是您可以通过仅以不同方式制定查询来解决的问题,您需要使用工具来(以编程方式)格式化结果。

在 Java 中,使用 Eclipse RDF4J,您可以执行以下操作(未经测试,因此您可能需要对其进行调整才能正常工作,但它应该给您一个大致的概念):

String query = "SELECT ?product WHERE {  ?product rdfs:subClassOf gr:ProductOrService . }";

// do the query on repo and convert to a Java list of URI objects     
List<URI> results = Repositories.tupleQuery(
  repo, 
  query, 
  r -> QueryResults.stream(r).map(bs -> (URI)bs.getValue("product")).collect(Collectors.toList()
);

// create a resource (bnode or URI) for the start of the rdf:List
Resource head = SimpleValueFactory.getInstance().createBNode();

// convert the Java list of results to an rdf:list and add it 
// to a newly-created RDF Model
Model m = RDFCollections.asRDF(results, head, new LinkedHashModel());

将结果作为 RDF 模型后,您可以使用任何现有的RDF4J APIs 将其写入文件或存储在三重存储中。

现在,我并不是说这是一个好主意——我从未见过这样的用例。但如果有必要,我会这样做。

【讨论】:

    【解决方案2】:

    我找到了解决方案。我使用了 SELECT,但没有使用绑定和变量,因为输出收到了“逗号分隔值(带有 N-Triples 语法中的字段)”CSV 文件:

    <http://www.productontology.org/id/Real_estate>
    <http://www.productontology.org/id/Automobile>
    <http://www.productontology.org/id/Auction>
    <http://www.productontology.org/id/Video_game>
    <http://www.productontology.org/id/Campsite>
    <http://www.productontology.org/id/Car>
    <http://www.productontology.org/id/Audiobook>
    <http://www.productontology.org/id/Browser_game>
    ...
    

    【讨论】:

    • 这并没有给出你在问题中所说的想要的内容(即包含结果 URI 的 rdf:List)。
    • 正如@JeenBroekstra 所说,这不是rdf:List。它也不是CSV——没有逗号。您在此处显示的字段不是“N-Triples 语法”(因为没有三元组),而只是 URIs 的列(而不是 CURIEs)。
    • 鉴于这个自我回答,我认为您的原始问题实际上相当于“我如何使用我正在使用的(未命名)工具来获取满足我的查询的纯文本 URI 列表, 而不是任何形式的 RDF 序列化?”
    【解决方案3】:

    看起来您应该阅读the SPARQL specification,它告诉您这完全符合预期。要获得您想要的单列,您必须使用SELECT

    SPARQL 有四种查询形式。这些查询表单使用来自模式匹配的解决方案来形成结果集或 RDF 图。查询形式为:

    • SELECT
      返回查询模式匹配中绑定的所有变量或变量的子集。
    • CONSTRUCT
      返回通过替换一组三元组模板中的变量构建的 RDF 图。
    • ASK
      返回一个布尔值,指示查询模式是否匹配。
    • DESCRIBE
      返回描述找到的资源的 RDF 图。

    【讨论】:

    • 我知道这正是我所期望的。我试图找出解决方法,只将 URI 作为响应而不绑定变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多