比较SPARQL图

时间:2013-06-26 14:58:52

标签: rdf sparql

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

1 个答案:

答案 0 :(得分:7)

我设置了一个Jena Fuseki端点,其中包含两个命名图形http://ahttp://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 }
  NOT EXISTS { graph <http://b> { ?s ?p ?o } }
}

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

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

select * where { 
  graph <http://b> { ?s ?p ?o }
  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