如何将两个RDF图与SPARQL进行比较?如果我有图:a和:b,我想找到所有的时间:a出现在:b . 我可以查询所有:a的主题,谓词和对象,然后以编程方式构建一个匹配的模式查询:a中的模式:b . 有没有一种方法可以构建一个:SPARQL中的模式查询,没有编程构造?
我设置了一个带有两个命名图形的Jena Fuseki endpoints , http://a 和 http://b ,我们称之为A和B.A包含一个三元组,B包含两个 . A,(查看)作为一组三元组,是B的子集,以下查询确认:
http://a
http://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
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 :
no
ask { NOT EXISTS { graph <http://b> { ?s ?p ?o } NOT EXISTS { graph <http://a> { ?s ?p ?o } } } } no
1 回答
我设置了一个带有两个命名图形的Jena Fuseki endpoints ,
http://a
和http://b
,我们称之为A和B.A包含一个三元组,B包含两个 . A,(查看)作为一组三元组,是B的子集,以下查询确认:现在,我们可以要求出现在一个而不是另一个中的三元组 . 要在B中要求不在A中的三元组,我们可以使用此查询:
我们也可以要求出现在B中的三元组,但不是在A中 . 我们期望并获得一个三元组 .
通常,如果X不包含不在Y中的三元组,则X是Y的子集 . 使用上述查询,我们可以找到一个在一个而不在另一个中的三元组 .
如果我们不关心特定的三元组,我们可以使用
ASK
查询来检查是否存在,而不会发现它们是什么 . 例如,因为没有这样的三元组 . 但是,由于我们试图询问A是否是B的子图,这表示它们不是三元组,我们需要在这里反转真值 . 所以我们使用:
同样,如果我们询问B是否是A的子图,我们得到
no
: