0

我在 OWL 中建模了以下场景:

Producer ----producesResource---> Resource <------consumesResource ---- Consumer

Producer,ResourceConsumer是 OWL 类,而producesResourceconsumesResource是对象属性。该场景非常直观,因为每个生产者生产一个或多个资源,由一个或多个消费者消耗。相反,每个消费者可以消耗一个或多个资源。本体相应地填充有实例/个体。

我想检查是否存在不是由生产者生产的消费者消费的资源。什么是通过以下方式获取此信息的优雅方式:

  1. 在 SPARQL 中查询
  2. SHACL 形状图(如果可能)。
4

1 回答 1

2

在 SPARQL 中可以使用 NOT BOUND 过滤器进行否定,或者在 SPARQL 1.1 中使用 MINUS 更容易:

SELECT ?resource WHERE
{
  ?resource a :Resource.

  ?consumer a :Consumer;
    ?consumer :consumesResource ?resource.

 MINUS {?producer a :Producer; :producesResource ?resource.}
}

您还可以使用ASK来获取布尔结果,但SELECT可以更轻松地调试以验证您的查询是否正常工作。

由于 SHACL 允许集成 SPARQL 查询,这也回答了您的第二个问题,但在这种情况下,单独使用 SPARQL 查询会更容易。

于 2022-01-24T11:23:48.410 回答