对连接的顶点递归应用过滤器(SPARQL)

对连接的顶点递归应用过滤器(SPARQL),sparql,rdf,amazon-neptune,Sparql,Rdf,Amazon Neptune,这是另一个关于使用SPAQRL for RDF生成一个查询的后续问题,该查询过滤掉所有顶点,这些顶点具有指向其他顶点的任何边,这些顶点不在我收到的指定值列表中 下面是我正在使用的图形的可视化表示,它包含两种不同RDF类型的节点(:package和:platform)。在该图中,包(:Package_A,:Package_B,:Package_C,和:Package_D)具有它们所需的每个平台的输出边缘,平台的值为:platform_1:和:platform_2 在此后续操作中,包现在也可以依赖于

这是另一个关于使用SPAQRL for RDF生成一个查询的后续问题,该查询过滤掉所有顶点,这些顶点具有指向其他顶点的任何边,这些顶点不在我收到的指定值列表中

下面是我正在使用的图形的可视化表示,它包含两种不同RDF类型的节点(
:package
:platform
)。在该图中,包(
:Package_A
:Package_B
:Package_C
,和
:Package_D
)具有它们所需的每个平台的输出边缘,平台的值为
:platform_1:
:platform_2

在此后续操作中,包现在也可以依赖于其他包,这在图形上表示为使用
:requires
边从
:package
到另一个
:package
,当它依赖于它时

在上图中,
包A
需要
包B
包C
,而
包B
包C
都需要
包D

以下是创建此图表的数据:

INSERT DATA {
   :Package_A             rdf:type   :package .
   :Package_B             rdf:type   :package .
   :Package_C             rdf:type   :package .
   :Package_D             rdf:type   :package .

   :Platform_1            rdf:type   :platform .
   :Platform_2            rdf:type   :platform .

   :Package_A             :platform  :Platform_1 .
   :Package_B             :platform  :Platform_1 .
   :Package_C             :platform  :Platform_1 .
   :Package_D             :platform  :Platform_1 . 

   :Package_D             :platform  :Platform_2 .

   :Package_A             :requires  :Package_B .
   :Package_A             :requires  :Package_C .
   :Package_B             :requires  :Package_D .
   :Package_C             :requires  :Package_D .
}
我可以查询此图以过滤掉所有
:将具有任何边的
顶点打包到不在指定值列表中的其他顶点。 例如,在这个指定的单例列表中:
[:Platform_1]
,下面的查询过滤掉
包D
,因为它包含
平台1
平台2
平台2
不在指定的列表中)<返回代码>程序包A、
程序包B
程序包C
,因为这些程序包只有通向
平台1
的边缘

SELECT * {
    ?package a :package .
     FILTER NOT EXISTS {
         ?package :platform ?platform . 
         FILTER (?platform NOT IN(:Platform_1))
     }
}
我现在尝试展开此查询,以便它也过滤掉
:需要
任何其他包(直接或传递)的任何顶点,该包满足相同条件,并且具有不在指定列表中的值的传出边

这意味着在列表
[:Platform_1]
的情况下,所有包都应该被过滤掉,因为所有包在
包D
上至少有一个可传递的
:requires
,它与
平台2
之间有一个:Platform edge,但不在指定的列表中

对于列表
[:Platform_1,:Platform_2]
,应返回所有包顶点,因为所有包顶点仅具有连接到
Platform_1
Platform_2
的边

我尝试使用递归运算符
*
获取所有可传递的
:requires
路径,并对其应用上面相同的筛选器。但是,当指定列表
[:Platform_1]
时,这不起作用,因为此查询的结果仍然包含
包A
包B
包C

SELECT * {
    ?package a :package .
     FILTER NOT EXISTS {
         ?package :requires* ?requires .
         ?package :platform ?platform . 
         FILTER (?platform NOT IN(:Platform_1))
     }
}

任何人都知道我如何构造一个查询,将所有具有边的顶点过滤到不在指定值列表中的其他顶点,并将具有
:requires
边(直接或传递)的顶点过滤掉这将导致另一个顶点满足相同的标准?

这是一个非常发人深省的问题。 在您的查询中,您希望过滤掉任何依赖于其他包的包,这些包的平台在已批准平台列表的“外部”

以下查询将起作用:

SELECT * {
    ?package a :package .
     FILTER NOT EXISTS {
         ?package :requires* ?requirement .
         ?requirement :platform ?platform .
         FILTER (?platform NOT IN(:Platform_1))
     }
}
与您的查询不同的是,它是具有平台的需求,而不是包。
*
将在没有需求(即包D)时以及在我们查看包本身的平台时处理该情况

为简洁起见,当您对需求列表不感兴趣时,可以这样表达上述查询:

SELECT * {
        ?package a :package .
         FILTER NOT EXISTS {
             ?package :requires*/:platform ?platform . #Notice the /.
             FILTER (?platform NOT IN(:Platform_1))
         }
    }

一个非常发人深省的问题。 在您的查询中,您希望过滤掉任何依赖于其他包的包,这些包的平台在已批准平台列表的“外部”

以下查询将起作用:

SELECT * {
    ?package a :package .
     FILTER NOT EXISTS {
         ?package :requires* ?requirement .
         ?requirement :platform ?platform .
         FILTER (?platform NOT IN(:Platform_1))
     }
}
与您的查询不同的是,它是具有平台的需求,而不是包。
*
将在没有需求(即包D)时以及在我们查看包本身的平台时处理该情况

为简洁起见,当您对需求列表不感兴趣时,可以这样表达上述查询:

SELECT * {
        ?package a :package .
         FILTER NOT EXISTS {
             ?package :requires*/:platform ?platform . #Notice the /.
             FILTER (?platform NOT IN(:Platform_1))
         }
    }

非常感谢您对
*
vs
+
以及我最初查询的问题所做的详细解释。我尝试了您的查询,看起来虽然当筛选器
?平台不在(:platform_1)
时,它不会正确地产生任何结果,但当筛选器
?平台不在(:platform_1,:platform_2)
时,我希望它会返回所有四个包,因为所有包都有:platform边,只指向列表
[:Platform_1,:Platform_2]
,而当列表
[:Platform_1,:Platform_2]时,此查询仅返回
:Package_D
提供了
。似乎此查询将过滤掉包含任何
:需要
边的任何包,对吗?我想也许我最初的问题没有明确解释过滤规则应该如何工作。我正在寻找一个查询,它将过滤掉包含导致Pl的:平台边的任何顶点atform值不在提供的列表中(例如
[:Platform_1,:Platform_2]
),并过滤掉具有任何
的任何顶点:需要直接或通过传递指向另一个顶点的
:Platform
边,该顶点不在此列表中(而不是过滤掉任何带有
:需要
边缘的内容)我想我现在明白了,谢谢你的解释。我将编辑我的答案。我