使用命名图是否会影响检索查询结果的速度?

Is the speed of retrieving a query result affected by using named graphs?

我正在使用 Sesame 服务器存储三元组。

第一题

我想知道存储库是否随着时间的推移变得越来越大,我想 运行 查询它,速度性能会受到影响吗?

第二个问题(如果第一个问题的答案是肯定的)

如果我对不同的三元组集使用命名图,并对它们进行 运行 查询,我检索结果的速度是否会比通常 运行 在整个存储库中检索结果快得多?

我想问的是——
这样慢吗:

PREFIX csm: <http://exmple.org/some_ontology.owl#>

SELECT ?b ?c
WHERE {
    ?a a 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.
    }
}

当存储的数据集非常庞大时?

我认为这在一定程度上取决于您使用的三层存储。 named-graphs我主要用的是过滤(不知道你说的分组是不是这个意思)。我们有海量数据和非常长的查询。每个数据集都存储在同一个存储库中的单独命名图中。没有命名图形的三元组(取决于反向链接或正向链接推理器)通常是推断的三元组。因此,为了加快查询速度,您可以根据命名图过滤一些三元组:

select *
   where{ 
      graph ?g {
         ?s a ?o.
      }
      filter (?g=<specific_graph>)
      ... the rest of the massive query
   }

我发现这种方法可以加快查询速度(尽管正如我之前提到的,它依赖于三元存储,因为我只使用过一些三元存储)。

拥有命名图的另一个好处是当您想要编写查询以仅从特定来源提取信息时。有时我们用它来追踪数据的来源。如果你有一个 API 坐在数据之上,你可以很容易地根据你拥有全部权利的图表进行过滤,一些权利,...

让我感到沮丧的是,一些三元组不太尊重命名图。例如,如果您在一个图中有一个三元组,而您在另一个图中重写了相同的三元组,则上下文或图可能会被覆盖,这很令人沮丧,并且会导致基于命名图的过滤不准确。我还没有真正玩过四人店,但我希望他们没有这个问题。我希望在两个不同的上下文中找到三元组,而不仅仅是最新的一个。

First question: I would like to know if the repository grows huge over time and I want to run queries over it, will speed performance be affected?

是的。大小对查询性能的影响程度取决于许多因素,最重要的是您使用的实际数据库实现、您如何配置该数据库以及实际数据的形状(例如类型语句的数量,等等),当然还有你做的查询类型。 Sesame 是一个 quadstore framework,它带有一些内置的数据库类型(内存中和本机),但是当然存在许多第三方 Sesame 兼容的 RDF 数据库,每个数据库都有自己的自己的性能特点。

Second question (if the answer for the first question is positive): If I use named graphs for different sets of triples, and run queries on them, will I retrieve the result much faster than if I would normally run them on the entire repository?

同样,这取决于您使用的数据库及其配置,以及您使用的查询类型。

假设您使用的是 Sesame 本地商店,并且至少启用了一个索引,其中命名图(或 Sesame 中称为 "context")是主键(例如 cspo) - 此外,您还有通常的默认索引(即 spocposc)。在这种情况下,如果您可以将命名图用作过滤器(也就是说,命名图本身预先 select 是总潜在结果的特定子集),则使用命名图可以显着提高性能:查询计划器可以使用 cspo 索引快速放大整个存储库的一个更小的子集。

但是请注意,在您的特定示例查询中,这无关紧要:在您的示例中,您假设 csm:someClass 类型的所有资源恰好出现在一个特定的命名图中(如果是不是这两个查询当然不会 return 相同的结果),所以实际上 selecting 命名图不会进一步减少潜在的答案集(与仅 selecting 相比csm:someClass 类型的所有资源)。

更详细地解释:查询引擎将在索引中查找查询中的每个图形模式。第一个模式 (?a a csm:someClass) 的查找成本最低,因为它只有一个自由变量。引擎将为此目的使用 posc 索引,因为它知道该索引的前两个键。查询的第二个模式将由第一个模式的结果启动(因此 ?a 将由第一个查找的结果实例化)。在查询 with 命名图时,引擎将 select cspo 索引,因为我们知道 cs。在查询 without named graph 时,它将 select spoc 索引,因为我们知道 s(但不是 c)。 但是,因为具有特定 s 的所有值总是出现在同一个命名图中,所以两次查找实际上将覆盖几乎完全相同数量的值:所有可能的值- op 的组合。 spoc 索引的范围当然也会超过 c,但它永远只有一个值,因此这是一种非常快速的查找。因此,这两个索引都将在非常可比的时间内 return 它们的结果,并且提前知道 c 不会提高性能(顺便说一句,我在这里稍微简化了查询引擎的工作以说明观点)。

命名图是用于数据组织目的的一个很好的工具,如果你有它们,在你的查询中使用它们是一个好主意,因为它可以帮助提高性能(而且肯定不会伤害)。但出于查询性能的目的,我不会纯粹 在命名图中组织我的数据。