Help:概念高速缓存

为了加快语义查询应答那些使用概念的查询的速度，Semantic MediaWiki提供了一种称为概念高速缓存（concept caching，概念缓存，概念缓冲）的特殊机制，用于预先计算处理查询结果. 对于那些规模较大但仍希望采用受控的方式来利用复杂查询的维基站点而言，这项功能尤为有用. 特别是，其中备有各式各样的选项，用来规定究竟哪些查询应当予以实时计算处理，而哪些查询则只有当存在可用的高速缓存的时候才应当予以应答.

对一个概念加以高速缓存所获得的性能提升，可以与采用一个MediaWiki类别来取代此概念的每个所用之处的效果相比拟. 这将同样影响所有使用此概念的语义查询以及此概念页面的显示. 另一方面，预先计算处理出来的一个概念查询的结果可能会过时，因此所显示的结果可能会不再与该维基站点上的内容相一致. 不过，可以规定高速缓存的结果在SMW尝试重新计算其结果之前究竟应当最长保持多久时间.

创建和管理概念高速缓存
在采用默认配置的情况下，只要一个概念高速缓存现成可用且创建了不长于一天的时间，SMW都将采用这个概念高速缓存. 要为一个概念创建一个缓存，可使用维护脚本SMW_conceptCache.php. 就像任何其他的SMW脚本那样，只需将其转移到目录[SMWpath]/maintenance当中，并运行php SMW_conceptCache.php即可. 这么做的话，将会显示出一份关于如何使用该脚本的文档. 如果这行不通，那么也许是因为您在自己的维基站点上使用了非标准的目录结构 – 关于在这种情况下如何运行脚本，请参阅 [SMWpath]/maintenance/README.

脚本SMW_conceptCache.php拥有三种基本的操作模式，并分别由相应的参数来对三者加以选择： deletes the caches of all concepts.
 * php SMW_conceptCache.php --status：显示您的站点上所有概念高速缓存的状态（包括没有概念高速缓存的情况）. 您现在可以利用这个模式来查看自己究竟拥有了哪些概念页面.
 * php SMW_conceptCache.php --create：为所有概念创建新的高速缓存，或者当它们早已存在时，对其加以更新.
 * php SMW_conceptCache.php --delete：删除所有概念的高速缓存.

上述这些操作都针对的是所有的概念. 同时，还有许多参数可用来将操作限制到仅仅是针对某些概念：
 * --concept "概念 名称"</tt>：仅仅处理所指定名称的这个概念. 该名称之中不得包含命名空间前缀，但当该名称之中含有空格的话，需要采用英文双引号“"”将其括起来.
 * --hard</tt>：仅仅处理那些依据当前维基站点设置而不允许在线计算处理的概念. 进一步的详情请参见下文.
 * --old </tt>：仅仅处理那些高速缓存存在时间长于 分钟或者根本就没有高速缓存的概念.
 * --update</tt>：仅仅处理那些已经具有某种高速缓存的概念，也就是说不创建任何新的高速缓存. 对于相反的情况（仅仅是那些没有高速缓存的概念），请采用参数--old </tt>，且 为一个非常大的数字，而这并不适用于任何已有的高速缓存.
 * -s </tt>：仅仅处理那些页面ID至少为 的概念.
 * -e </tt>：仅仅处理那些页面ID顶多为 的概念.

上述这些选项可以组合起来，对概念的选择做出进一步的限制. 例如，调用下列脚本的话：

php SMW_conceptCache.php --create --update --old 30</tt>

将会为早已拥有高速缓存的所有概念创建高速缓存，但其高速缓存存在时间要长于30分钟.

配置SMW以使用高速缓存
SMW备有三种用于在查询当中和概念页面之上处理概念的基本选项：
 * 当需要时利用当前维基站点的数据来计算处理概念的元素（elements）.
 * 从高速缓存之中获取概念的元素.
 * 彻底拒绝使用概念，将其视为没有任何结果的查询.

SMW的默认行为是采用那些可用的，时间不长于一天的高速缓存；否则，只要依据当前维基站点的设置，允许当前概念作为（非概念）嵌入式查询，就会实时计算处理概念元素. 对于概念的规模和复杂性的限制比嵌入式查询要松些，因而可以创建不允许作为嵌入式查询的概念. 默认情况下，将会仅仅依据高速缓存来返回此类概念的结果（不论高速缓存存在了多长时间），否则将不予提供. 下列小节将解释用于配置这种行为的相关参数.

允许哪些查询为嵌入式？
有三个参数可用于确定查询的"复杂程度"：规模、深度以及它所采用的查询功能的类型.
 * 规模实际上指的是查询之中查询条件的总数.
 * 深度指的是链式属性语句（chained property statements）的最大个数.
 * 例如， Some property::value </tt> 的深度为1，而 property1.property2::value </tt>的深度为2.


 * 查询功能则指的是所采用的查询条件的类型. 您可以利用#ask</tt>，结合format=debug</tt>，查看查询的规模和深度.

SMW备有若干的配置选项，用于设置最大规模和深度，以及用于限制嵌入式查询或特殊页面上的查询所可以使用的功能. 这些参数及其默认值分别为：
 * $smwgQMaxSize = 12;</tt>
 * $smwgQMaxDepth = 4;</tt>
 * $smwgQFeatures = SMW_PROPERTY_QUERY | SMW_CATEGORY_QUERY | SMW_CONCEPT_QUERY | SMW_NAMESPACE_QUERY | SMW_CONJUNCTION_QUERY | SMW_DISJUNCTION_QUERY;</tt>

所允许的功能默认情况下其实就是所有现成可用的功能，而在大型的维基站点上，亦可对其加以限制. 比如，要仅仅允许类别和概念查询时，可以在LocalSettings.php当中做出如下设置：

$smwgQFeatures = SMW_CATEGORY_QUERY | SMW_CONCEPT_QUERY;</tt>

如果要同时允许这些查询进行合取（conjunction）（交集），则可以使用下列设置：

<tt>$smwgQFeatures = SMW_CATEGORY_QUERY | SMW_CONCEPT_QUERY | SMW_CONJUNCTION_QUERY;</tt>

如果依据这些选项而不允许某个查询时，则会将其缩减为更为简单的查询. 概念可以使用那些并不符合这些要求的查询. 如果发生这种情况，那么就不会"实时"计算处理这个概念，而且只有当已经为此概念创建了高速缓存的时候，才会显示相应的结果. 可在脚本<tt>php SMW_conceptCache.php</tt>之中，利用选项<tt>--hard</tt>，来选择受此影响的那些概念. 采取这种方式，用户可以创建（提出）概念，而管理员则可在可行的情况下提供相应的高速缓存.

概念之中允许哪些查询？
对于概念，SMW支持与上述查询设置类似的设置，而只是默认值稍有不同：
 * <tt>$smwgQConceptMaxSize = 20;</tt>
 * <tt>$smwgQConceptMaxDepth = 8;</tt>
 * <tt>$smwgQConceptFeatures = SMW_PROPERTY_QUERY | SMW_CATEGORY_QUERY | SMW_NAMESPACE_QUERY | SMW_CONJUNCTION_QUERY | SMW_DISJUNCTION_QUERY;</tt>

与前面一样，这些设置亦可在LocalSettings.php之中加以变更. 这些默认值表明，在概念之中将会允许某些在<tt>#ask</tt>之中并不允许的查询. 如前所述，在拥有某种高速缓存之前，将不会启用此类概念.

硬式概念与简单概念
上述小节谈到，在SMW之中，有些概念被视为"硬式（hard）"概念. 默认情况下，这指的是当它们表示的是那些不允许作为嵌入式查询的查询的情况. 通过设置选项<tt>$smwgQConceptCaching</tt>的取值，可以改变这种情况. 可能的设置有：


 * <tt>$smwgQConceptCaching = CONCEPT_CACHE_HARD;</tt>：如上所述的默认设置.
 * <tt>$smwgQConceptCaching = CONCEPT_CACHE_ALL;</tt>：所有概念均被视为"硬式"概念，也就是说，从不对概念进行在线计算处理，且概念始终依赖于高速缓存.
 * <tt>$smwgQConceptCaching = CONCEPT_CACHE_NONE;</tt>：任何概念均不被视为"硬式"概念. 如果存在可用的高速缓存，则它们仍可以使用高速缓存（参见下一小节），但它们在任何情况下并不依赖于高速缓存. 当概念命名空间的写入权限仅限于特定受信任的用户组，且只有该用户组才能创建新的概念查询的时候，这项设置尤为有用.

SMW之中的默认设置为 <tt>$smwgQConceptCaching = CONCEPT_CACHE_HARD;</tt>

何时才会使用可用的高速缓存？
硬式概念将始终尝试去使用高速缓存，因为在没有高速缓存的情况下，它们就不可能显示任何东西. 对于简单的概念，在线重新计算结果是有可能的，而SMW将利用高速缓存的存在时间（cache age）来决定到底要做什么. 配置参数<tt>$smwgQConceptCacheLifetime</tt>规定的是特定高速缓存到底允许存在多久（以分钟计算）. 如果SMW的配置允许在线计算高速缓存的元素，则不会使用较老的高速缓存.

将会高速缓存多少项？
设置$smwgQMaxLimit定义的是每个概念到底高速缓存多少项. 当您的概念所具有的项目比默认设置多的时候，应当考虑采用该项设置所必需的合适大小.