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

Filter out vertices that have outgoing edges to other vertices that are NOT in a specified list of values (SPARQL)

我正在为 RDF 使用 SPARQL,但在想出一个查询时遇到了问题,该查询将允许我过滤掉与不在指定值列表中的其他顶点有边的所有顶点。

这是我正在使用的图表的可视化表示,其中包含两种不同的 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 .
}

我想形成一个查询,该查询能够 return 所有具有 rdf:type = :package 的顶点,但我想排除所有具有任何出站边缘的平台的包不在指定平台值的列表中。

例如,对于这个指定的单例列表: [:Platform_1]

Package_APackage_BPackage_C 应该被 return 编辑,因为这些包 只有 具有导致 Platform_1.

虽然 Package_D 应该被过滤掉,因为它包含 Platform_1Platform_2 的边缘(并且 Platform_2 不在指定列表中)。

到目前为止,我已尝试使用 FILTER 进行此查询,但它不起作用,因为 Package_D 仍由它 return 编辑:

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

任何人都知道我如何形成一个查询来排除任何具有不在列表中的值的边的顶点(在这种情况下,任何导致 Platform_2 的边)?

您查询的问题是,如果 any 平台顶点匹配条件,则过滤条件成功。您返回 Package_D,因为其中一个平台是 :Platform_2,它不在列表 (:Platform_1) 中 - 因此条件成功。

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

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

字面意思是:“将提供的列表中没有平台的软件包还给我:”。