我有一个带有多个关系的RDF文件。有些关系暂时关闭。我之前在此链接中发布了一个有关如何在Sparql中构造属性的传递闭包的问题。现在,我可以使用属性的可传递闭包构造新的三元组,这意味着在整个路径上都进行提取。例如,存在一个part_of
关系,如果?a
ispart_of
?b
和?b
is part_of
?c
,那么我们可以推断出a
is 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
part_of
?c
。那我可以这样查询吗?
construct {?a :part_of ?c}
where {
?a :part_of+ ?b .
?b :is_a+ ?c .
filter(?a != ?c)
}
然后,我还有另一个条件,其中包括这两个传递闭包:例如,如果?a part_of?b和?b is_a?c,那么我们可以推断出?a part_of?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关系的每个地方,您会发现此模式匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句