5

我正在做一些实验,在Tomcat的openrdf-workbench webapp 中导入海龟语言制定的三元组,其中包含一个 SPARQL 端点。

我想知道是否使用turtle,或者通常在RDF / RDFS中是否可以有条件地在所有(隐式)主题上添加某个谓词/对象声明以存在另一个谓词/对象。

例如,如果我定义了以下三元组:

foo:a foo:b foo:c
foo:d foo:b foo:c
foo:e foo:b foo:c
foo:f foo:b foo:c

我想自动将以下谓词/主题添加到与 predicate=foo:b和 object=匹配的所有主题中foo:c

(implicit subject) foo:g foo:h

为了自动产生以下三元组:

foo:a foo:g foo:h
foo:d foo:g foo:h
foo:e foo:g foo:h
foo:f foo:g foo:h

这可能吗?

或者:有什么方法可以定义一些三元组,以使 SPARQLfoo:a/d/e/f在查询具有foo:g foo:h谓词/宾语的主题时能够找到?

4

2 回答 2

8

第 1 部分 - 创建附加信息

您问题的第一部分可以通过以下两种方式之一解决:

  1. 使用推理
  2. 使用 SPARQL 更新

推理

推理是一种技术,您可以通过该技术定义基于现有三元组推断附加三元组的规则。您通常要么使用一组预定义的规则,要么使用您自己的自定义规则。我认为 Sesame 仅支持开箱即用的预定义规则集,因此您可能想看看OWLIM,它是可与 Sesame 一起使用的替代后端,并且具有更多可定制的规则 AFAIK。

推理通常可以通过两种方式应用,一种是您只存储规则并在每次触发规则时计算附加信息,另一种是您预先计算所有附加信息并将其添加到数据库中。您将要使用哪个取决于您打算如何使用您的系统,并且涉及到性能权衡。我不会详细介绍,因为这确实是另一个问题 - 请参阅Forward vs Backward Chaining进行一些讨论

SPARQL 更新

或者,如果您的规则相对简单,并且您可以预先计算额外信息并将其添加到您的数据库中,您可以编写 SPARQL 更新来执行此操作,例如

PREFIX foo: <http://example.org/foo#>
INSERT
{
  ?x foo:g foo:h .
}
WHERE
{
  ?x foo:b foo:c .
}

第 2 部分 - 查询数据

我猜您对 SPARQL 相当陌生,因为根据您的描述,这对我来说听起来微不足道。

如果我想找到所有有谓语foo:g和宾语的主语,foo:h我只需写下以下内容:

PREFIX foo: <http://example.org/foo#>
SELECT ?x
WHERE
{
  ?x foo:g foo:h .
}
于 2014-03-06T17:44:56.657 回答
6

You can do this type of inference using OWL with an axiom of the form

p value a ⊑ q value b

which says that if something has a as a value for property p, then it also has b as a value for property q. As an example, here's an ontology with four individuals (a, b, c, d), two object properties (p, q), and the axiom (p value c ⊑ q value d).

@prefix :      <http://example.org/add-predicate-object#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://example.org/add-predicate-object> a owl:Ontology .

:p a owl:ObjectProperty .
:q a owl:ObjectProperty .

[ a owl:Restriction ;
  owl:onProperty :p ;
  owl:hasValue   :c ;
  rdfs:subClassOf [ a owl:Restriction ;
                    owl:onProperty :q ;
                    owl:hasValue   :d ] . ] .

:a a owl:Thing, owl:NamedIndividual ; :p :c .
:b a owl:Thing, owl:NamedIndividual ; :p :c .
:c a owl:Thing, owl:NamedIndividual .
:d a owl:Thing, owl:NamedIndividual .

In Protégé, the axiom looks like this:

enter image description here

You can enable a reasoner and query for instances of q value d and see:

enter image description here

or you can browse to individuals and see the results:

enter image description here

于 2014-03-06T18:57:01.407 回答