如何在SPARQL中使用CONSTRUCT或DESCRIBE隔离RDF文件中的URI列表?

时间:2018-02-09 16:10:49

标签: select sparql rdf

我试图只获取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。

3 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:1)

我找到了解决方案。我已经使用了SELECT,但是没有绑定和变量,因为输出接收了一个&#34;逗号分隔值(带有N-Triples语法的字段)&#34; 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>
...

答案 2 :(得分: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将其写入文件或将其存储在三元库中。

现在,我并没有声称任何这个是个好主意 - 我从来没有见过像这样的用例。但如果有必要,我会这样做。