reference. 关系查询参考:DSL与项目谓词[math-000B]
本页是关系查询的速查表。示例式讲解见用miniKanren查询规则与查询没有入向引用的页面;这里集中列出语法与可用谓词。
查询DSL[#127]
query/run*:声明要返回的逻辑变量并收集全部解。fresh:引入只在当前目标内可见的存在量词变量。conde:析取,列出多个可接受的目标分支。==:统一两个项;=/=约束两项不相等。fail/succeed:失败与成功的空目标,用作条件选择。
目标顺序会影响效率:先把变量限定到可索引的类别,再调用nodeo,可以避免枚举全站节点。
内容节点关系[#129]
分析阶段为每篇文章IR生成content-node relation,记录所属页面、父节点、同级位置、类型、属性、纯文本投影与字符数。常用入口:
pageo:页面事实,包括ID、标题与元数据。nodeo:内容节点事实,包括节点ID、类别与属性。node-propertyo:读取节点的某个属性,例如链接目标。source-locationo:节点的源文件、行与列。math-containing-paragrapho、shorter-than-o、plain-text-paragrapho、contains-texto、topic-membero:段落与主题的现成谓词。
跨文章的查询必须在项目的#:analyze阶段运行,因为此时整个站点才分析完成。
项目自定义谓词[#130]
项目可以基于这些事实定义自己的算子。Flora的project.scm就是例子:
incoming-pageo:合并link与transclude两种入向引用。not-membero:递归检查一个值不在有限列表中,用作miniKanren的集合差。authored-pageo:用pageo排除inline subtree自动生成的页面。orphan-pageo:没有入向引用的文章页面。
边界[#131]
node-id只在本次分析结果中有效,不应保存为外部引用。关系查询在有限事实集合上计算,不是对无限输入的证明。把项目概念(例如孤立页面)表达为关系,不需要Grove预先知道它。