让我说我在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> |
+--------------------------------+------------------------------+---------------------------------------------------+---------------------------+
我显然可以得到关于单词的三倍&#34;使用以下内容,但不显示命名图成员资格
select * { ?s ?p ?o }
如何编写一个查询,检索有关单词的三元组,并指出{ :goodbye a :word }
来自图:farewells
?
答案 0 :(得分:4)
你可以按照以下方式做点什么:
SELECT *
WHERE {
{ GRAPH ?g { ?s ?p ?o } }
UNION
{ ?s ?p ?o .
FILTER NOT EXISTS { GRAPH ?g { ?s ?p ?o } }
}
}
联合的第一部分选择命名图中的所有三元组。第二部分抓取默认图中的所有三元组,明确排除命名图中出现的模式。
答案 1 :(得分:4)
在GraphDB中,您可以使用pseudographs来实现此目的,即。即<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 |
+------------------------------------+----------+-----------+-------+
答案 2 :(得分:2)
简短的“回答”:避免将数据放入GraphDB中的默认图形(以及其他具有“虚拟”默认图形的三重存储,这只是所有命名图形的UNION)
背景:GraphDB决定将默认图形定义为所有命名图形和默认图形的并集。 SPARQL语义规范不支持此行为,但是特定于实现的行为。
所以你真的有三个选择:
按照Jeen Broekstra的说明使用FILTER NOT EXISTS或MINUS。这可能会对查询效果产生严重的负面影响。
使用Stanislav Kralin所示的GraphDB伪图。此选项使您的查询(和您的系统)依赖于GraphDB - 您无法在以后更改SPARQL引擎,而无需调整查询。
避免将数据放入默认图表中。您可以定义“您自己的”默认图表,例如将其命名为http://default/,并将其放入SPARQL FROM子句中。
其他三重存储允许启用/禁用此功能。我在GraphDB的文档中找不到切换。否则这将是第4个,也是我的首选选项。