Sparql 使用命名图是否会影响检索查询结果的速度?
我使用Sesame服务器存储三元组集 第一个问题 我想知道,如果存储库随着时间的推移而变得庞大,并且我想在其上运行查询,那么速度性能会受到影响吗 第二个问题(如果第一个问题的答案是肯定的) 如果我对不同的三元组使用命名图,并对它们运行查询,那么检索结果的速度会比通常在整个存储库中运行它们快得多吗 我想问的是-Sparql 使用命名图是否会影响检索查询结果的速度?,sparql,semantic-web,sesame,triplestore,named-graphs,Sparql,Semantic Web,Sesame,Triplestore,Named Graphs,我使用Sesame服务器存储三元组集 第一个问题 我想知道,如果存储库随着时间的推移而变得庞大,并且我想在其上运行查询,那么速度性能会受到影响吗 第二个问题(如果第一个问题的答案是肯定的) 如果我对不同的三元组使用命名图,并对它们运行查询,那么检索结果的速度会比通常在整个存储库中运行它们快得多吗 我想问的是- 这是不是比较慢: PREFIX csm: <http://exmple.org/some_ontology.owl#> SELECT ?b ?c WHERE { ?a
这是不是比较慢:
PREFIX csm: <http://exmple.org/some_ontology.owl#>
SELECT ?b ?c
WHERE {
?a a csm:SomeClass.
?a ?b ?c.
}
前缀csm:
选择?b?c
在哪里{
csm:SomeClass。
a?b?c。
}
除此之外:
PREFIX csm: <http://exmple.org/some_ontology.owl#>
SELECT ?b ?c
WHERE {
GRAPH <http://example.org/some_graph> {
?a a csm:SomeClass.
?a ?b ?c.
}
}
前缀csm:
选择?b?c
在哪里{
图表{
csm:SomeClass。
a?b?c。
}
}
当存储的数据集非常庞大时?我认为这在一定程度上取决于您使用的triplestore。我主要使用命名图来进行过滤(我不知道你提到分组时的意思是否相同)。我们有大量的数据和很长的查询。每个数据集都存储在同一存储库中的单独命名图中。没有命名图表的三元组(取决于反向链接或正向链接推理器)通常是推断的三元组。因此,为了加快查询速度,您可以根据命名图过滤一些三元组:
select *
where{
graph ?g {
?s a ?o.
}
filter (?g=<specific_graph>)
... the rest of the massive query
}
选择*
何处{
图?g{
是的。
}
过滤器(?g=)
…大规模查询的其余部分
}
我发现这种方法加快了查询的速度(尽管正如我前面提到的,它依赖于triplestore,因为我只使用了一些triplestore)
具有命名图的另一个优点是,当您希望编写查询以仅从特定源提取信息时。有时我们用它来追踪数据的出处。如果您有一个位于数据顶部的API,您可以轻松地根据您拥有完全权限、某些权限的图形进行筛选
我发现令人沮丧的一点是,一些TripleStore不太尊重命名图。例如,如果在一个图中有一个三元组,而在另一个图中重写了同一个三元组,则上下文或图可能会被覆盖,这会令人沮丧,并使基于命名图的筛选不准确。我还没有真正玩过四方商店,但我希望他们没有这个问题。我希望能在两种不同的环境中找到三元组,而不仅仅是最新的一个
第一个问题:我想知道,如果存储库随着时间的推移而变得庞大,并且我想在其上运行查询,那么速度性能会受到影响吗
对。大小对查询性能的影响程度取决于许多因素,最重要的是您使用的实际数据库实现、数据库的配置方式,还取决于实际数据的形状(例如类型语句的数量等),当然还有您执行的查询类型。Sesame是一个quadstore框架,它附带了一些内置数据库类型(内存中的和本机的),但当然存在许多与Sesame兼容的第三方RDF数据库,每个数据库都有自己的性能特征
第二个问题(如果第一个问题的答案是肯定的):如果我对不同的三元组使用命名图,并对它们运行查询,那么检索结果的速度会比通常在整个存储库中运行它们快得多吗
同样,这取决于您使用的数据库及其配置,以及您使用的查询类型
假设您使用的是Sesame原生存储,并且启用了至少一个索引,其中命名图(或Sesame中的“上下文”)是主键(例如cspo
)-此外,您还具有常用的默认索引(即spoc
和posc
)。在这种情况下,如果您可以将命名图用作过滤器(即,命名图本身预先选择总潜在结果的特定子集),那么使用命名图可以显著提高性能:查询规划器可以使用cspo
索引快速放大总存储库中的较小子集
但是,请注意,在您的特定示例查询中,这无关紧要:在您的示例中,您假设csm:someClass
类型的所有资源恰好出现在一个特定的命名图中(如果不是这种情况,两个查询当然不会返回相同的结果),因此,实际上选择命名图并不会进一步减少潜在答案集(与仅选择类型为csm:someClass
的所有资源相比)
更详细地解释:查询引擎将查找查询中每个图形模式的索引。第一个模式(?csm:someClass
)是查找最便宜的模式,因为它只有一个自由变量。引擎将为此使用posc
索引,因为它知道该索引的前两个键。查询的第二个模式将由第一个模式的结果启动(因此,?a
将由第一个查找的结果实例化)。在使用命名图的查询中,引擎将选择cspo
索引,因为我们知道c
和s
。在没有命名图的查询中,它将选择spoc
索引,因为我们知道s
(但不知道c
)。但是,由于具有该特定s
的所有值始终出现在同一命名图中,因此两个查找实际上都会在几乎完全相同数量的值上进行:所有可能的o
和p
的值组合。当然,spoc
索引的范围也将超过c
,但它只有一个值,因此它是一个非常快速的lo