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