假设我将以下插入插入我的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语义规范的支持,而是实现的行为。
所以您确实有三个选择:
-
使用过滤器不存在或减去Jeen Broekstra所解释的。这可以对查询性能产生严重的负面影响。
-
使用stanislav kralin示例的GraphDB伪扫描。此选项使您的查询(和系统)依赖于GraphDB-您稍后无法更改SPARQL引擎,而无需调整查询。
-
避免将数据放入默认图中。您可以定义"您自己的"默认图,例如称其为http://default/,然后将其从子句中放入Sparql。
其他三重商店允许启用/禁用此功能。我找不到GraphDB文档中的开关。否则,这将是第四,我的首选选项。