如何使用construct或在SPARQL中描述RDF文件中的URI列表



我正在尝试在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,而是像binds,vars等的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,但具有相同的属性和对象。

看起来您应该阅读SPARQL规范,该规范告诉您,这完全是预期的。要获取您想要的单列,必须使用SELECT

sparql具有四个查询表格。这些查询表单使用模式匹配的解决方案来形成结果集或RDF图。查询表格是:

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

我找到了一个解决方案。我已经使用了选择,但不是绑定和vars,因为输出接收了"逗号分隔的值(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>
...

表示SPARQL选择查询作为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 API将其写入文件或将其存储在Triplestore中。

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

最新更新