如何在SPARQL中构造属性的传递闭包?

时间:2014-12-01 15:07:04

标签: rdf sparql

我有一个RDF / XML数据集,它有一些可以构建到一些推理规则中的关系。我在Jena API中使用SPARQL构建了推理规则。例如,如果part_oftermA part_of,而termBtermB part_of,则存在termC关系,因此我们可以推断termApart_of termC。但是我需要递归地使这个规则起作用,所以我希望从这个规则中推断出的所有三元组再次被称为输入数据集,然后使用这个规则进行检查。为了推断新的三元组,我在construct中使用了SPARQL

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX go: <http://www.geneontology.org/dtds/go.dtd#>
CONSTRUCT {?termA go:part_of ?termC}
WHERE {
  ?termA go:part_of ?termB .
  ?termB go:part_of ?termC .
  FILTER (?termA != ?termC) .
}

从上面的查询中,我只能推断出part_of关系的两个层次,但我需要的是多层次关系。所以我尝试使用Marianne Shaw的Ontology Views Update幻灯片9中显示的语法来创建这样的子查询,而可能可能基于Simon Schenk的A SPARQL Semantics Based on Datalog

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX go: <http://www.geneontology.org/dtds/go.dtd#>
CONSTRUCT {?termA go:part_of ?termC}
FROM <A:/workspace_luna/RDFQuery/src/test.rdf>
FROM NAMED ?g <CONSTRUCT {?termA go:part_of ?termC}
               FROM <A:/workspace_luna/RDFQuery/src/test.rdf>
               WHERE {
                 ?termA go:part_of ?termB .
                 ?termB go:part_of ?termC .
                 FILTER (?termA != ?termC) .
               }>
WHERE {
  ?termA go:part_of ?termB .
  ?termB go:part_of ?termC .
  FILTER (?termA != ?termC) .
}

但我收到了一个错误。我在很多方面环顾四周,并试图应用于我的查询,但没有人工作。还有其他办法吗?

1 个答案:

答案 0 :(得分:2)

代码中的问题

  

所以我试着像这样制作子查询:...

我不确定您尝试使用哪种子查询语法,但这不合法。子查询只是用大括号括起来。例如,

select ?s where {
  { select ?x where { ... } }
}

您撰写的查询不合法。

  

但我得到了一个错误。

如果您没有向我们展示错误,我们肯定无法帮助修复它。我希望你有一个语法错误。您可以使用sparql.org的查询验证程序验证您的查询。但是,在这种情况下,这可能无济于事,因为您只能在子查询中使用选择查询。 (但是,如果子查询支持构造查询,那将非常有用。)

构造查询的传递闭包

通常,您不能在SPARQL中进行任意递归。但是,在您具有的特定情况下,您可以使用模式中的属性路径来构造模式的传递闭包。例如,

construct { ?a :partOf ?b }
where { ?a :partOf+ ?b }

这表示如果仅使用:partOf 链接从?a ?c 存在非零长度的路径,则包括构造输出中的三个?a:partOf?b