select 所有三元组,如果相关则指示命名图
select all triples, indicating named graph if relevant
假设我将以下内容插入到我的 GraphDB 8.3 三重存储中:
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> |
+--------------------------------+------------------------------+---------------------------------------------------+---------------------------+
我显然可以通过以下方式获得两者 "triples about words",但随后未显示命名图成员资格
select * { ?s ?p ?o }
我如何编写一个查询来检索关于单词的两个三元组并指示 { :goodbye a :word }
来自图 :farewells
?
您可以按照以下方式做一些事情:
SELECT *
WHERE {
{ GRAPH ?g { ?s ?p ?o } }
UNION
{ ?s ?p ?o .
FILTER NOT EXISTS { GRAPH ?g { ?s ?p ?o } }
}
}
并集的第一部分选择命名图中的所有三元组。第二部分获取默认图中的所有三元组,明确排除命名图中出现的模式。
在 GraphDB 中,您可以使用 pseudographs 来达到这个目的,即。 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 } }
只会return
+------------------------------------+----------+-----------+-------+
| ?g | ?s | ?p | ?o |
+------------------------------------+----------+-----------+-------+
| <http://www.ontotext.com/explicit> | :hello | rdf:type | :word |
+------------------------------------+----------+-----------+-------+
短 "answer":避免将数据放入 GraphDB 中的默认图形(以及其他具有 "virtual" 默认图形的三元组存储,它只是所有命名图形的 UNION)
背景:GraphDB 决定将默认图定义为所有命名图和默认图的并集。此行为不受 SPARQL 语义规范支持,而是特定于实现的行为。
所以你真的有三个选择:
如 Jeen Broekstra 所述,使用 FILTER NOT EXISTS 或 MINUS。这会对查询性能产生严重的负面影响。
使用 Stanislav Kralin 举例说明的 GraphDB 伪图。此选项使您的查询(和您的系统)依赖于 GraphDB——如果不调整您的查询,您以后无法更改 SPARQL 引擎。
避免将数据放入默认图表。您可以定义 "your own" 默认图,例如将其命名为 http://default/,并将其放在 SPARQL FROM 子句中。
其他三重存储允许 enable/disable 此功能。我在 GraphDB 的文档中找不到开关。否则这将是第四个,也是我的首选选项。
假设我将以下内容插入到我的 GraphDB 8.3 三重存储中:
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> |
+--------------------------------+------------------------------+---------------------------------------------------+---------------------------+
我显然可以通过以下方式获得两者 "triples about words",但随后未显示命名图成员资格
select * { ?s ?p ?o }
我如何编写一个查询来检索关于单词的两个三元组并指示 { :goodbye a :word }
来自图 :farewells
?
您可以按照以下方式做一些事情:
SELECT *
WHERE {
{ GRAPH ?g { ?s ?p ?o } }
UNION
{ ?s ?p ?o .
FILTER NOT EXISTS { GRAPH ?g { ?s ?p ?o } }
}
}
并集的第一部分选择命名图中的所有三元组。第二部分获取默认图中的所有三元组,明确排除命名图中出现的模式。
在 GraphDB 中,您可以使用 pseudographs 来达到这个目的,即。 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 } }
只会return
+------------------------------------+----------+-----------+-------+
| ?g | ?s | ?p | ?o |
+------------------------------------+----------+-----------+-------+
| <http://www.ontotext.com/explicit> | :hello | rdf:type | :word |
+------------------------------------+----------+-----------+-------+
短 "answer":避免将数据放入 GraphDB 中的默认图形(以及其他具有 "virtual" 默认图形的三元组存储,它只是所有命名图形的 UNION)
背景:GraphDB 决定将默认图定义为所有命名图和默认图的并集。此行为不受 SPARQL 语义规范支持,而是特定于实现的行为。
所以你真的有三个选择:
如 Jeen Broekstra 所述,使用 FILTER NOT EXISTS 或 MINUS。这会对查询性能产生严重的负面影响。
使用 Stanislav Kralin 举例说明的 GraphDB 伪图。此选项使您的查询(和您的系统)依赖于 GraphDB——如果不调整您的查询,您以后无法更改 SPARQL 引擎。
避免将数据放入默认图表。您可以定义 "your own" 默认图,例如将其命名为 http://default/,并将其放在 SPARQL FROM 子句中。
其他三重存储允许 enable/disable 此功能。我在 GraphDB 的文档中找不到开关。否则这将是第四个,也是我的首选选项。