我有一个RDF文件,上面有几个关系。一些关系具有传递性的封闭性。我之前发布了一个关于如何在这个link中在Sparql中构造属性的传递闭包的问题。现在我能够使用属性的传递闭包构造新的三元组,这意味着在整个路径中提取。
例如,如果part_of
为?a
part_of
,而?b
为?b
part_of
,则存在?c
关系,因此我们可以推断a
是part_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
答案 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?)+
表示:
如果您查看要推断:part_of关系的每个地方,您会看到此模式匹配。