Help:修复SMW数据

Semantic MediaWiki (SMW)所使用的所有数据都存储在维基页面里. 如果这些数据过时或含有任何错误的话，总是可以完全重建这些来自相应维基站点的数据. 不会丢失任何的数据. 在某些软件更新时以及在首次安装（因为安装时也会收集一些已有的元数据）之后，也都需要刷新数据.

本页面旨在说明多种用于从根本上修复/初始化任何SMW安装的方法. 单个页面上数据的刷新只需对该页面进行编辑和保存即可实现. 如果有许多的页面，利用SMW管理员页面Special:SMWAdmin的一种功能来自动完成这项工作则比较方便. 在命令行当中使用维护脚本SMW_refreshData.php，亦可达此目的.

要确保所有维基页面在修复之后都能够显示新的数据，可以运行脚本touch LocalSettings.php（或者，无法使用命令行时，可采用某种普通的方式 来对其加以编辑）. 该脚本会废弃任何的MediaWiki页面高速缓存，否则后者可使您看到旧版本的维基页面.

使用SMW管理员页面Special:SMWAdmin
管理员特殊页面Special:SMWAdmin提供有一个用于修复全部数据的功能. 该页面仅对具有管理员身份的维基用户开放. 而且，只有当配置选项$smwgAdminRefreshStore设置为true（默认值）的时候，才能在线启动或停止更新过程.

一旦启动，更新就要花费一定的时间. 在Special:SMWAdmin页面上可以查看其进度. 即使是在更新启动之后关闭了选项$smwgAdminRefreshStore，正在进行之中的更新过程也会继续进行，且可以在线加以跟踪. 只有当启用$smwgAdminRefreshStore的时候，才有可能停止此过程.

根据维基站点的不同，更新所需的时间也会各不相同. 在阅览每个页面的过程中，也会进行更新. 如果查阅您的维基站点的人有很多，则更新会进展得更快些. 如果页面数量很多，则更新会花费更长的时间. 正常情况下，在更新进度达到50%之前，更新过程会比较快，因为在这个部分当中，刷新的只是属性和类型页面. 所有维基页面的实际更新是从进度50%时开始的. 要加快这一过程，您可以使用MediaWiki维护脚本runJobs.php. 请考虑规定一个参数--maxjobs 1000或者类似的限制，以便该脚本的每次运行限定在有限的时间内. 否则，该脚本往往倾向于占用越来越多的内存空间.

使用SMW维护脚本
尽管基本上可以在不利用维护脚本的情况下使用上述方法，但同时还有一个脚本SMW_refreshData.php</tt>，可以在不事先进行任何访问存取的情况下，对维基站点的所选部分直接进行刷新. SMW_refreshData.php</tt>的基本操作就是遍历当前维基站点的所有页面，并重新存储每个页面的语义数据. 正常情况下，进入您的SMW安装目录[SMW_path]/maintenance</tt>，然后执行下列命令：

php SMW_refreshData.php -v

当然，需要在命令行安装php</tt>. 如果这个方法对您的站点不起作用（比如，因为异常的目录结构），请阅读文件[SMW_path]/maintenance/README</tt>.

上述脚本按照所有页面在您的维基数据库之中的存储顺序，对它们加以遍历，并刷新其相应的数据. 参数-v</tt>用于确保打印输出该脚本的进度. 像往常一样，按组合键"CRTL-C"，即可中断该脚本的执行. 该脚本所显示的索引号，不仅指的是MediaWiki之中所使用的页面索引，同时也指的是SMW在其语义数据之中所使用的索引. 鉴于这个原因，该脚本可以处理数值大于该维基站点之中最大页面索引的索引号.

如果您拥有大量的页面，则该脚本在执行过程中可能会花费大量的内存空间，因此最好在比如说2000页之后停下来. 这是因为一个PHP内存泄漏造成的. 作为一个变通措施，该脚本的运行一次只能针对部分的页面：采用参数-s</tt>和-e</tt>分别定出所要刷新的第一页和最后一页. 比如：

php SMW_refreshData.php -v -s 1000 -e 2999

可能会需要多次运行该脚本，比如，只有当存储了属性的数据类型之后，才能对属性数据加以存储. 可以采用参数-tp</tt>来运行该脚本，从而首先仅仅刷新类型和属性页面，这样，在进行第二次刷新的时候，这些数据已经现成可用. 总的来说，在正常情况下，刷新应当不超过两次.

要保证所有的维基页面都显示的是刷新之后的新数据，运行touch LocalSettings.php</tt>即可. 这将废弃任何的MediaWiki页面高速缓存，否则这些缓存可能使您看到的是旧版本的维基页面.

全部重建
在大多数情况下，上述这些方法应当能够修复SMW之中的数据记录. 然而，可以想象的是，出于某种原因，SMW存储之中仍会存在某些错误的内容. 在这种情况下，就有必要在刷新所有数据之前彻底删除和重新安装SMW的数据库结构.

要彻底删除全部的SMW数据，请配以参数--delete</tt>来使用安装脚本SMW_setup.php</tt>：

php SMW_setup.php --delete

此后，就像重新安装SMW那样，首先再次运行php SMW_setup.php</tt>，继而采用上述那些方法，启动对所有数据的修复.

亦可配以参数-f</tt>来运行刷新脚本SMW_refreshData.php</tt>，从而一步删除和重建所有的数据. 在这种情况下，建议首先重建所有属性和类型的记录，之后在处理其余的数据. 因此，可以按下列方式来运行脚本：

php SMW_refreshData.php -ftpv php SMW_refreshData.php -v

当然，请注意：只有第一次运行使用参数-f</tt>. 如上一节所述，在大型维基站点上，可再次使用参数<tt>-s</tt>和<tt>-e</tt>.

自动修复功能
维基页面上的某些变更也需要对其他页面上的数据加以更新. 例如，如果变更的是某个其中含有语义标注的模板，则可能也会需要更新所有采用该模板的页面的数据. 类似地，如果某个属性的数据类型发生了变更，则应当刷新所有采用该属性的页面. SMW通常会自动处理此类更新. 就像在MediaWiki之中那样，要完成所需的全部更新，可能会花费一些时间. 在这种情况下，并没有任何方便的手段来查看进度，但作业数量（参见Special:Statistics）可以反映维基站点当前的背景活动.

告诫
当通过把配置参数$smwgNamespacesWithSemanticLinks设为<tt>true</tt>，来添加新的命名空间或者激活已有命名空间的时候，如本页所述，对于数据的修复或初始化，并不会重建默认属性Modification date（修订日期）. 在这种新的命名空间当中，当一个页面添加到维基站点当中之后，每次当修订该页面的时候，才会创建该属性.