Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sparql 使用命名图是否会影响检索查询结果的速度?_Sparql_Semantic Web_Sesame_Triplestore_Named Graphs - Fatal编程技术网

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

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

我使用Sesame服务器存储三元组集

第一个问题

我想知道,如果存储库随着时间的推移而变得庞大,并且我想在其上运行查询,那么速度性能会受到影响吗

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

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

我想问的是-
这是不是比较慢:

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