Graph 将具有传出边的顶点过滤到不在指定值列表(SPARQL)中的其他顶点

Graph 将具有传出边的顶点过滤到不在指定值列表(SPARQL)中的其他顶点,graph,sparql,rdf,amazon-neptune,Graph,Sparql,Rdf,Amazon Neptune,我正在使用SPARQL进行RDF,但在提出一个查询时遇到了问题,该查询将允许我过滤掉所有顶点,这些顶点具有指向不在指定值列表中的其他顶点的边 下面是我正在使用的图形的可视化表示,它包含两种不同RDF类型的节点(:package和:platform)。在此图中,包(:Package_A,:Package_B,:Package_C,和:Package_D)具有其所需的每个平台的输出边缘,平台的值为:platform_1:和:platform_2: 以下是创建此图表的数据: INSERT DATA

我正在使用SPARQL进行RDF,但在提出一个查询时遇到了问题,该查询将允许我过滤掉所有顶点,这些顶点具有指向不在指定值列表中的其他顶点的边

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

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

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 .
}
我希望形成一个查询,能够使用rdf:type=:package返回所有顶点,但我希望将所有具有任何传出边的包排除到不在指定平台值列表中的平台

例如,对于此指定的单例列表:
[:平台1]

Package\u A
Package\u B
Package\u C
应该返回,因为这些包只有通向
平台1
的边缘

Package_D
应该被过滤掉,因为它同时包含
Platform_1
Platform_2
(并且
Platform_2
不在指定列表中)

到目前为止,我已尝试使用
过滤器进行此查询,但该过滤器不起作用,因为
包D
仍由其返回:

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

任何人都知道我如何形成一个查询,将任何具有边的顶点排除到列表中不存在的值(在本例中,任何导致
Platform_2
)的边?

查询的问题是,如果任何Platform vertice匹配条件,则过滤条件成功。您将返回包D,因为其中一个平台是
:Platform_2
,它不在列表
(:Platform_1)
-因此条件成功

您需要的是一个过滤条件,用于检查列表中是否没有匹配的平台。为此,SPARQL具有
NOT EXISTS
条件,该条件将图形模式作为参数:

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

字面意思是:“将所提供列表中不存在平台的包还给我:”。

感谢您的解释!实际上,我是在进行一个查询,该查询显示“将仅在提供的列表中存在的平台的包还给我”(因此,在本例中,包D将是唯一被过滤掉的包),我在对查询进行了一点修改后(使用
不在
中,而不是
中的
)就能够让它工作了:
?包a:包。过滤器不存在{软件包:平台?平台。过滤器(?平台不在(:平台_1))}
在这种情况下,您可以使用
过滤器存在
平台在…
中消除双重否定。意思相同,但可能更容易理解。