选择所有三元组,指示命名图(如果相关)



假设我将以下插入插入我的GraphDB 8.3 Triplestore:

PREFIX : <http://example.com/>
insert data { :hello a :word }

PREFIX : <http://example.com/>
insert data { graph :farewells { :goodbye a :word }}

现在,如果我问

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

我只得到

+--------------------------------+------------------------------+---------------------------------------------------+---------------------------+
|               ?g               |              ?s              |                        ?p                         |            ?o             |
+--------------------------------+------------------------------+---------------------------------------------------+---------------------------+
| <http://example.com/farewells> | <http://example.com/goodbye> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://example.com/word> |
+--------------------------------+------------------------------+---------------------------------------------------+---------------------------+

我显然可以在以下内容中获得两个"关于单词的三重三"

select * { ?s ?p ?o }

我如何编写一个查询,以检索两个单词的三元格并表明{ :goodbye a :word }来自Graph :farewells

您可以按照这些行做一些事情:

SELECT * 
WHERE {
   { GRAPH ?g { ?s ?p ?o } }
   UNION
   { ?s ?p ?o .
     FILTER NOT EXISTS { GRAPH ?g { ?s ?p ?o } } 
   }
}

联合的第一部分选择了命名图中的所有三元组。第二部分抓住默认图中的所有三元组,明确排除了命名图中发生的模式。

在GraphDB中,您可以为此目的使用伪码表,即。e。<http://www.ontotext.com/explicit>(似乎您没有使用推断)。

尝试此查询:

SELECT * FROM NAMED <http://www.ontotext.com/explicit>
{ GRAPH ?g { ?s ?p ?o } }

结果应为:

+------------------------------------+----------+-----------+-------+
| ?g                                 | ?s       | ?p        | ?o    |
+------------------------------------+----------+-----------+-------+
| <http://www.ontotext.com/explicit> | :hello   | rdf:type  | :word |
| :farewells                         | :goodbye | rdf:type  | :word |
+------------------------------------+----------+-----------+-------+

有关比较,请注意

SELECT * FROM NAMED <http://www.openrdf.org/schema/sesame#nil>
{ GRAPH ?g { ?s ?p ?o } }

将仅返回

+------------------------------------+----------+-----------+-------+
| ?g                                 | ?s       | ?p        | ?o    |
+------------------------------------+----------+-----------+-------+
| <http://www.ontotext.com/explicit> | :hello   | rdf:type  | :word |
+------------------------------------+----------+-----------+-------+

简短"答案":避免将数据放入GraphDB中的默认图中(以及其他带有"虚拟"默认图的三重存储,这只是所有命名图的结合)

背景:GraphDB决定将默认图定义为所有命名图和默认图的联合。这种行为不是由SPARQL语义规范的支持,而是实现的行为。

所以您确实有三个选择:

  1. 使用过滤器不存在或减去Jeen Broekstra所解释的。这可以对查询性能产生严重的负面影响。

  2. 使用stanislav kralin示例的GraphDB伪扫描。此选项使您的查询(和系统)依赖于GraphDB-您稍后无法更改SPARQL引擎,而无需调整查询。

  3. 避免将数据放入默认图中。您可以定义"您自己的"默认图,例如称其为http://default/,然后将其从子句中放入Sparql。

其他三重商店允许启用/禁用此功能。我找不到GraphDB文档中的开关。否则,这将是第四,我的首选选项。

相关内容

  • 没有找到相关文章

最新更新