在进行任意路径查询之前过滤 sparql 结果
Posted
技术标签:
【中文标题】在进行任意路径查询之前过滤 sparql 结果【英文标题】:filtering sparql results before doing an arbitrairy path query 【发布时间】:2018-09-11 09:26:35 【问题描述】:为了解释我的问题,我举个例子:
假设我们有一个包含 3 个类的 RDF 三元存储:
:Apple
:Orange
:Pear
我们有 1 个属性:
:friendsWith
苹果、橙子和梨可以与其他苹果、橙子和梨成为朋友。 我要实现的查询是:
“给定 apple/123,给我所有与 apple/123 成为朋友的苹果和梨,除了橙子。”
我当前版本的 SPARQL 查询如下所示:
SELECT DISTINCT ?appleOrPear WHERE
<apple/123> :friendsWith* ?appleOrPear .
FILTER NOT EXISTS ?appleOrPear a :Orange.
这个查询确实只给了我连接到 apple/123 的苹果和梨。但是,它也会给我通过橙子连接的苹果和梨,这是我不想要的。
所以我需要一种在查询的任意路径部分完成之前过滤结果的方法。换句话说,我想忽略整个查询的整个 :orange 类。
在 SPARQL 中有没有办法做到这一点?
【问题讨论】:
子 SELECT 查询? 你将如何使用 sub SELECT 来解决这个问题?能举个例子吗? 【参考方案1】:您可以检查:friendsWith
链中<apple/123>
和?appleOrPear
之间没有:Orange
类型的节点。
SELECT distinct ?appleOrPear WHERE
<apple/123> :friendsWith* ?appleOrPear .
filter not exists
<apple/123> :friendsWith* ?x .
?x :friendsWith* ?appleOrPear .
?x a :Orange .
【讨论】:
非常好的主意。这几乎可以工作。但是,这也会删除可通过橙色和非橙色路径访问的实体。 是的,它排除了存在通过 :Orange 实例的路径的所有解决方案。由于在计算路径表达式期间无法根据主题/对象的类型排除特定的 :friendsWith 关系,因此唯一的另一个想法是以某种方式仅标记/放置相关的 :friendsWith 关系并查询这些关系。例如。仅将 :Apple 和 :Pear 的实例之间的所有 :friendsWith 关系放在单独的上下文中并在那里查找,或者使用仅链接苹果和梨的 :friendsWith 的不同子属性。 添加不同的上下文实际上是我尝试解决的现实问题的可行选择,非常感谢 Damyan。我很遗憾,尽管 SPARQL 对任意路径查询的可能性有限,但它的重点还是不支持路径查询。以上是关于在进行任意路径查询之前过滤 sparql 结果的主要内容,如果未能解决你的问题,请参考以下文章