内联查询,用于列出命名空间中没有任何子对象的所有页面

时间:2016-05-05 02:06:55

标签: mediawiki semantic-mediawiki

我需要一个内联查询,列出特定命名空间中的所有页面,但不会列出这些页面上指定的subobjects

Restricting results to a namespace可能是这样的:

{{#ask: [[ExampleNamespace:+]] }}

但它也列出了所有子对象。

解决方法:

  • 在这些页面上指定一个类别(子对象不继承它)并改为查询该类别:

    {{#ask: [[ExampleCategory]] }}
    
  • 在这些页面上指定一个属性(从不在子对象上)并查询属性(具有wildcard值):

    {{#ask: [[ExampleProperty::+]] }}
    

但两种解决方法都需要编辑,我想避免。 有更好的解决方法吗?

1 个答案:

答案 0 :(得分:1)

不确定它是否是一种更好的方式,但它看起来像数组格式/数组,并且它们的#arraymap#arrayunique函数是一种方法,可以修剪SMW子对象标记并制作DISTINCT操作。不幸的是,下面的解决方案也描述了查询结果限制问题(至少在我所知的SMW中)。一般来说,它可能如下所示,如果有人提出更好的解决方案,我将不胜感激:

<!-- Fetch all pages from the "Live event" namespace -->
{{#arraydefine: QUERY_RESULT
| {{#ask: [[Live event:+]]
  | format = array
  | link = none <!-- NOTE: array item link -->
  | limit = 10000 <!-- NOTE: limit -->
  }}
}}

<!-- Store the mapped result into another array -->
{{#arraydefine: MAPPED_QUERY_RESULT
| {{#arraymap: {{#arrayprint: QUERY_RESULT}}
  | ,
  | $O <!-- NOTE: array map iterator value -->
  | {{#explode: $O <!-- NOTE: explode by hash -->
    | #
    | 0
    }}
  }}
| ,
| unique
}}

<!-- Generate links markup -->
{{#arraymap: {{#arrayprint: MAPPED_QUERY_RESULT}}
| ,
| $O
| [[$O]] <!-- NOTE: plain links -->
}}

上述代码中的注释:

  • 注意:数据项链接 - 不禁止链接会导致映射器更复杂(包括解析HTML <span>标记和class属性)。
  • 注意:限制 - 这可能是最大的问题,因为子对象的数量会影响查询结果。默认情况下,SMW会限制查询结果,并且就我所知,无法覆盖最大查询限制。如果计数超过限制的行数将会导致“进一步限制”。链接出现。实际上,我不知道如何很好地解决它。
  • 注意:数组映射迭代器值 - {{#arraymap}}似乎以最简单的方式替换字符串,如sed或简单的文本编辑器应用程序。所以$O用作formula参数的迭代器值占位符,试图不与其他字符串标记冲突。
  • 注意:按哈希爆炸 - #ask子对象结果会生成像PageA#_159c1f213de2fcaf165f2c9c5c56686b这样的散列链接。只是摆脱他们。如果你需要删除wiki链接,你也可以使用[[|(分别编码为[<nowiki/>[<nowiki>|</nowiki>
  • 注意:普通链接 - 生成的链接将使用下划线而不是空格。遗憾的是,[[{{#replace: $O | _ | <nowiki> </nowiki>}}]]对我不起作用 - 由于某些原因,下划线只是被消费了,但是在#replace功能维基页面上也建议采用这种方法。

一些链接: