如何在SPARQL中结合两个TRANSITIVE CLOSURE来构造新的三元组?

时间:2014-12-02 15:06:09

标签: rdf sparql

我有一个RDF文件,上面有几个关系。一些关系具有传递性的封闭性。我之前发布了一个关于如何在这个link中在Sparql中构造属性的传递闭包的问题。现在我能够使用属性的传递闭包构造新的三元组,这意味着在整个路径中提取。 例如,如果part_of?a part_of,而?b?b part_of,则存在?c关系,因此我们可以推断apart_of ?c。然后我这样做了我的查询:

construct {?a :part_of ?b} where {?a :part_of+ ?b . filter(?a != ?b) }

然后我有另一个传递闭包。例如,is_a ?a is_a?b ?b is_a存在?c关系,因此我们可以推断?a is_a ?c。然后我这样做了我的查询:

construct {?a :is_a ?b} where {?a :is_a+ ?b . filter(?a != ?b)}

然后我有另一个条件,包括这两个传递闭包: 例如,如果?a part_of ?b?b is_a ?c,我们可以推断出?a {{1 }} part_of。那我可以这样查询吗?

?c

1 个答案:

答案 0 :(得分:1)

  

然后我有另一个条件,包括这两个   传递闭包:例如,如果?a part_of?b,?b is_a?c,那么   我们可以推断出一个部分?c。那我可以这样查询吗?

单独写这个,它只是:

construct { ?a :part_of ?c }
where {
  ?a :part_of ?b .
  ?b :is_a ?c
}

(我不确定这是否真的有意义。毕竟,?c是一个类型,而不是一个实例。我的手指是我的一部分,我是一个人但是我的手指不是人类的一部分,尽管手指可以是人类的一部分。)

由于您不在构造部分中使用?b,您甚至可以将其转换为属性路径:

construct { ?a :part_of ?c }
where { ?a :part_of/:is_a ?c }

但是,这些都没有处理问题的传递部分。我们来看看。你说当你可以跟随一个:part_of链时,应该有一个:part_of链接,每当有一个:part_of后跟一个:is_a时,应该有一个:part_of链接。您可以将它们与:

结合起来
construct { ?a :part_of ?c }
where { ?a (:part_of+/:is_a?)+ ?c }

路径(:part_of+/:is_a?)+表示:

  • (1)一次或多次出现:
    • (2)出现一次或多次:part_of
    • (3)任选后跟
    • (4)零次或一次出现:is_a

如果您查看要推断:part_of关系的每个地方,您会看到此模式匹配。