3

如何将两个 RDF 图与 SPARQL 进行比较?如果我有图表:a 和:b,我想找到所有时间:a 出现在:b 中。我可以查询 :a 的所有主题、谓词和对象,然后以编程方式构建一个模式查询,该查询将匹配 :b 中的 :a 模式。有没有一种方法可以在 SPARQL 中构建 :a 模式查询,而无需编程构造?

4

1 回答 1

8

http://a我用两个命名图和设置了一个 Jena Fuseki 端点,http://b我们将其称为 A 和 B。A 包含一个三元组,B 包含两个。A,(被视为)作为一组三元组,是 B 的子集,以下查询证实了这一点:

select * where { 
  graph ?g { ?s ?p ?o }
}

-----------------------------------------------------------
| s            | p            | o            | g          |
===========================================================
| <urn:uuid:b> | <urn:uuid:p> | <urn:uuid:b> | <http://b> |
| <urn:uuid:a> | <urn:uuid:p> | <urn:uuid:b> | <http://b> |
| <urn:uuid:a> | <urn:uuid:p> | <urn:uuid:b> | <http://a> |
-----------------------------------------------------------

现在,我们可以要求出现在一个中而不出现在另一个中的三元组。要在 B 中请求不在 A 中的三元组,我们可以使用以下查询:

select * where { 
  graph <http://a> { ?s ?p ?o }
  FILTER NOT EXISTS { graph <http://b> { ?s ?p ?o } }
}

-------------
| s | p | o |
=============
-------------

我们也可以要求出现在 B 中但不在 A 中的三元组。我们期望并收到一个三元组。

select * where { 
  graph <http://b> { ?s ?p ?o }
  FILTER NOT EXISTS { graph <http://a> { ?s ?p ?o } }
}

----------------------------------------------
| s            | p            | o            |
==============================================
| <urn:uuid:b> | <urn:uuid:p> | <urn:uuid:b> |
----------------------------------------------

一般来说,如果 X 不包含不在 Y 中的三元组,则 X 是 Y 的子集。使用上述查询,我​​们可以找到这样的三元组,它们在一个中而不在另一个中。

如果我们不关心特定的三元组,我们可以使用ASK查询来检查是否存在,而无需找出它们是什么。例如,

ask { 
  graph <http://a> { ?s ?p ?o }
  NOT EXISTS { graph <http://b> { ?s ?p ?o } }
}

no

因为没有这样的三元组。但是,由于我们试图询问 A 是否B的子图,这表明它们不是三元组,所以我们需要在这里反转真值。所以我们使用:

ask { 
  NOT EXISTS {
    graph <http://a> { ?s ?p ?o }
    NOT EXISTS { graph <http://b> { ?s ?p ?o } }
  }
}

yes

类似地,如果我们问 B 是否是 A 的子图,我们得到no

ask { 
  NOT EXISTS {
    graph <http://b> { ?s ?p ?o }
    NOT EXISTS { graph <http://a> { ?s ?p ?o } }
  }
}

no
于 2013-06-27T13:31:13.410 回答