2

假设我在我的 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

4

3 回答 3

4

您可以按照以下方式做一些事情:

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

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

于 2017-09-27T00:08:14.753 回答
4

在 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 |
+------------------------------------+----------+-----------+-------+
于 2017-09-27T10:04:43.563 回答
2

简短的“答案”:避免将数据放入 GraphDB 中的默认图(以及其他具有“虚拟”默认图的三元组存储,它只是所有命名图的 UNION)

背景:GraphDB 决定将默认图定义为所有命名图和默认图的并集。此行为不受 SPARQL 语义规范的支持,而是特定于实现的行为。

所以你真的有三个选择:

  1. 按照 Jeen Broekstra 的解释,使用 FILTER NOT EXISTS 或 MINUS。这会对查询性能产生严重的负面影响。

  2. 使用以 Stanislav Kralin 为例的 GraphDB 伪图。此选项使您的查询(和您的系统)依赖于 GraphDB——您以后无法更改 SPARQL 引擎,而无需调整您的查询。

  3. 避免将数据放入默认图表中。您可以定义“您自己的”默认图,例如将其命名为http://default/,并将其放在 SPARQL FROM 子句中。

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

于 2017-09-28T10:55:31.750 回答