Semantic MediaWiki:如何向查询传递多可选属性值并灵活适配
解决方案:Semantic MediaWiki动态传入多值查询条件
核心思路
Semantic MediaWiki的#ask查询无法直接解析预先生成的字符串变量(比如你之前尝试的TempString),必须动态生成多值条件片段,直接嵌入查询语句中。以下是两种适配场景的可行方案:
方案1:基于页面存储的表单属性值
如果表单提交后,多选项值已存储在当前页面的某一属性(比如你提到的Variable)中,可通过#arraymap函数将属性值拼接为查询所需的[[Property-A::值1||值2]]格式:
{{#ask: [[Category:Category-A]] {{#arraymap: {{#show: {{PAGENAME}} | ?Variable | format=plainlist | sep=; }} | ; | x | [[Property-A::x]] | || }} |?Property-A |format=tree |parent=PartOf }}
关键说明:
#show获取当前页面Variable属性的所有值,用sep=;指定分隔符为分号;#arraymap按分号分割每个值,将每个值转换为[[Property-A::x]]格式,再用||(OR逻辑)拼接起来;- 确保已安装Parser Functions扩展(
#arraymap依赖此扩展)。
方案2:基于模板直接传递的表单参数
如果表单直接将多选项值以分隔符拼接的参数(比如selected-values)传给模板,或使用多个独立参数,可分别处理:
场景A:单参数传入分隔符拼接的多值
{{#ask: [[Category:Category-A]] {{#arraymap: {{{selected-values|}}} | ; | x | [[Property-A::x]] | || }} |?Property-A |format=tree |parent=PartOf }}
只需让表单将选中的多个值用分号拼接后,传入selected-values参数即可。
场景B:多个独立参数(固定数量的可选值)
如果表单使用多个独立参数(比如val1、val2、val3),可通过#if逐个判断并拼接条件:
{{#ask: [[Category:Category-A]] {{#if: {{{val1|}}} | [[Property-A::{{{val1}}}]] | }} {{#if: {{{val2|}}} | || [[Property-A::{{{val2}}}]] | }} {{#if: {{{val3|}}} | || [[Property-A::{{{val3}}}]] | }} |?Property-A |format=tree |parent=PartOf }}
为什么你的原方案无效?
你之前尝试将拼接好的字符串存入TempString再传入查询,SMW会将TempString视为单个字面量值,而非解析其中的||逻辑分隔符。必须直接在#ask的条件块中动态生成每个值的查询片段,才能让SMW正确识别多值OR逻辑。
内容的提问来源于stack exchange,提问作者user2037572
相关产品推荐
相关产品推荐

