在进行任意路径查询之前过滤 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 链中&lt;apple/123&gt;?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 结果的主要内容,如果未能解决你的问题,请参考以下文章

SPARQL 联合查询不返回所有解决方案

Where和Having的区别

在 MySQL 中应用查询之前过滤表

数据库笔记-SQL过滤(LIKE&正则表达式)

HAVING和WHERE的区别

Hadoop MapReduce 文件路径过滤 GlobStatus 与 PathFilter