vscode-templete/.claude/skills/auto-wiki-cn/validators/fibo-mcp.md

111 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FIBO MCP运行时逻辑校验器
> 外部校验器,通过 SPARQL 查询 FIBO 本体627K 推理三元组)校验 wiki 中知识的逻辑结构。
> 可选增强——不可达时 lint 退化为 schema.py 格式校验 + 种子静态规则。
>
> 基于 [NeuroFusionAI/fibo-mcp](https://github.com/NeuroFusionAI/fibo-mcp)MIT将 FIBO 本体物化为可查询的 MCP SPARQL 端点。
## 服务信息
| 项 | 值 |
|----|-----|
| 端点 | `https://mcp.ablemind.cc/fibomcp/mcp` |
| 协议 | MCP Streamable HTTP`Mcp-Session-Id`HTTPS via Cloudflare |
| 工具 | 仅 `sparql`(无 search |
| 数据规模 | 627,712 triples含 OWL-RL 推理物化) |
## 调用方式
通过 MCP 协议发送 `tools/call` 请求tool name = `sparql`,参数为 SPARQL 查询字符串。
需要先 `initialize` 获取 `Mcp-Session-Id`,后续请求带上该 header。
> **无需用户凭证**`Mcp-Session-Id` 是 MCP Streamable HTTP 传输层的标准会话标识(类似 HTTP Session由 Agent 调用 `initialize` 时自动获取,不需要用户配置 API key 或任何密钥。该端点为公开只读 SPARQL 查询服务。
## 校验的三个层次
schema.py 校验页面格式frontmatter 字段有没有、类型对不对)。
FIBO SPARQL 校验知识逻辑——三个层次:
### 1. 逻辑通路:关系的 domain/range 是否合法
Agent 写了一条关系,这条关系在标准本体中合法吗?
**查询模板**:给定一个属性名,查其 domain 和 range。
```sparql
SELECT DISTINCT ?domainLabel ?rangeLabel WHERE {
?prop rdfs:label ?propLabel .
FILTER(CONTAINS(LCASE(STR(?propLabel)), "{property_name}"))
?prop rdfs:domain ?domain . ?domain rdfs:label ?domainLabel .
?prop rdfs:range ?range . ?range rdfs:label ?rangeLabel .
}
```
**示例**(以 `has trustee` 为例2026-04-07 验证):
| domain | range |
|--------|-------|
| business entity | trustee |
| trust | trustee |
| trust | controlling party |
-> 如果 Agent 写 `PensionProduct --hasTrustee--> X`逻辑通路不合法PensionProduct 不在 domain 中。
### 2. 条件边:实体成立的必要关系
Agent 创建了一个实体页面,需要哪些必要关系?
**查询模板**:给定一个类的 URI查其 OWL 约束。
```sparql
SELECT DISTINCT ?onPropLabel ?restrictType ?valueLabel WHERE {
<{class_uri}> rdfs:subClassOf ?r .
{ ?r owl:onProperty ?p . ?p rdfs:label ?onPropLabel .
?r owl:someValuesFrom ?v . ?v rdfs:label ?valueLabel .
BIND("someValuesFrom" AS ?restrictType) }
UNION
{ ?r owl:onProperty ?p . ?p rdfs:label ?onPropLabel .
?r owl:allValuesFrom ?v . ?v rdfs:label ?valueLabel .
BIND("allValuesFrom" AS ?restrictType) }
}
```
`someValuesFrom` = 该类实体**必须**存在此关系(至少一个)。
`allValuesFrom` = 该关系的值**只能**是指定类型。
### 3. 类型层级:实体归类是否正确
Agent 把实体标记为某个类型,标准本体中有没有?
**查询模板**:模糊搜索类名。
```sparql
SELECT DISTINCT ?label ?def WHERE {
?class rdfs:label ?label .
FILTER(CONTAINS(LCASE(STR(?label)), "{keyword}"))
OPTIONAL { ?class <http://www.w3.org/2004/02/skos/core#definition> ?def }
}
```
如果搜不到,校验应提示:"该类型不在标准本体中,请确认命名"。
## 集成方式
不改 Skill 核心流程,作为 lint 的可选增强层:
```
lint → schema.py 格式校验
→ 外部校验器(如果 meta.yaml 声明了 validator 且可达)
├─ 逻辑通路relation type 的 domain/range 是否匹配
├─ 条件边必要关系someValuesFrom是否缺失
└─ 类型层级:实体类型是否在标准本体中
→ 健康报告
```
## 原则
- 不把 FIBO 约束硬编码进 schema.py——外部参考不是内部规则
- 不要求 wiki 页面完全满足所有 OWL 约束——报告缺失即可Agent 判断是否补充
- 不在 ingest 时阻塞——逻辑校验只在 lint 时运行ingest 优先保证速度
- 服务不可达时静默跳过——在健康报告中注明"外部校验器不可达,已跳过"