对连接的顶点递归应用过滤器(SPARQL)
这是另一个关于使用SPAQRL for RDF生成一个查询的后续问题,该查询过滤掉所有顶点,这些顶点具有指向其他顶点的任何边,这些顶点不在我收到的指定值列表中 下面是我正在使用的图形的可视化表示,它包含两种不同RDF类型的节点(对连接的顶点递归应用过滤器(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 在此后续操作中,包现在也可以依赖于
: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
边,该顶点不在此列表中(而不是过滤掉任何带有:需要边缘的内容)我想我现在明白了,谢谢你的解释。我将编辑我的答案。我