第219章 KnowledgeRepository
219.1 KnowledgeRepository定义
在 ICAI 系统中,Object、State、Relation 解决的是对象、状态以及对象之间关系的结构化表达。
在此基础上,系统还需要保存能够被后续认知计算使用的知识事实。
因此建立:
KnowledgeRepositoryKnowledgeRepository
KnowledgeRepository 是 Knowledge Domain Object 与持久化系统之间的边界,负责知识的保存、查询和更新。
其核心模型为:
KR=(K,M,Q,U,P,T)KR=(K,M,Q,U,P,T)
其中:
- KK:Knowledge,知识对象;
- MM:Mapping,知识对象与数据库数据之间的映射;
- QQ:Query,知识查询;
- UU:Update,知识更新;
- PP:Persistence,知识持久化;
- TT:Time,操作时间。
因此:
KnowledgeRepository=KnowledgeSave+KnowledgeQuery+KnowledgeUpdate\boxed{ KnowledgeRepository = KnowledgeSave + KnowledgeQuery + KnowledgeUpdate }
基本结构:
Knowledge Domain Object
↓
KnowledgeRepository
↓
KnowledgeMapper
↓
PDO
↓
MySQL
读取方向:
MySQL
↓
PDO
↓
KnowledgeRepository
↓
KnowledgeMapper
↓
Knowledge Domain Object
219.2 Knowledge领域对象
前面的 KnowledgeService 与 KnowledgeEngine 已经定义:
K=(S,P,O,C,St)K=(S,P,O,C,S_t)
其中:
- SS:Subject,知识主体;
- PP:Predicate,知识谓词;
- OO:Object,知识客体;
- CC:Condition,知识成立条件;
- StS_t:Knowledge State,知识状态。
例如:
Object-A
↓
supports
↓
Method-M1
可以表示:
K=(Object-A,supports,Method-M1,C,St)K=(Object\text{-}A,supports,Method\text{-}M1,C,S_t)
知识不是简单的一段文字。
在 ICAI 中,知识首先是可以被计算、匹配、验证和更新的结构化认知对象。
因此:
Knowledge≠TextKnowledge\neq Text
同时:
Knowledge≠MySQL RecordKnowledge\neq MySQL\ Record
数据库记录只是 Knowledge 的持久化形式。
219.3 KnowledgeRepository与KnowledgeEngine
这是本章最重要的职责边界。
KnowledgeEngine负责:
知识计算
知识匹配
知识推导
知识条件判断
知识验证
知识更新候选计算
KnowledgeRepository负责:
知识保存
知识查询
知识读取
知识更新
因此:
KnowledgeEngine=KnowledgeCalculationKnowledgeEngine=KnowledgeCalculation
而:
KnowledgeRepository=KnowledgePersistenceKnowledgeRepository=KnowledgePersistence
正确结构:
Facts
Rules
Conditions
Relations
States
↓
KnowledgeEngine
↓
Knowledge Candidate
↓
Verification
↓
UpdateEngine
↓
KnowledgeRepository
↓
MySQL
Repository 不应该自己进行知识推理。
例如:
supports(A,B)∧supports(B,C)→supports(A,C)supports(A,B) \land supports(B,C) \rightarrow supports(A,C)
这个计算属于 KnowledgeEngine。
Repository 只负责保存最终被允许持久化的知识事实。
219.4 知识保存
知识保存的基本流程:
Knowledge
↓
Validate
↓
Map
↓
Check Existing
↓
Insert
↓
ReadBack
↓
Verify
公式:
Save(K)→Validate→Map→Persist→VerifySave(K) \rightarrow Validate \rightarrow Map \rightarrow Persist \rightarrow Verify
这里的 Verify 是持久化验证,不等于知识内容本身的推理。
219.5 知识保存条件
知识保存至少需要检查:
ValidKnowledge=Subject∧Predicate∧Object∧Condition∧Rule∧EvidenceValidKnowledge = Subject \land Predicate \land Object \land Condition \land Rule \land Evidence
其中:
- Subject:主体合法;
- Predicate:谓词合法;
- Object:客体合法;
- Condition:成立条件合法;
- Rule:允许形成该知识;
- Evidence:存在依据。
但是必须进一步区分:
KnowledgeExists≠KnowledgeValidKnowledgeExists \neq KnowledgeValid
以及:
KnowledgeValid≠KnowledgeVerifiedKnowledgeValid \neq KnowledgeVerified
因此知识可以存在以下状态:
candidate
valid
verified
unverified
outdated
invalid
conflicted
archived
219.6 知识状态
Knowledge State 是知识生命周期的一部分。
例如:
candidate
↓
valid
↓
verified
异常路径:
verified
↓
outdated
或者:
verified
↓
conflicted
最终:
archived
因此:
SK∈{candidate,valid,verified,unverified,outdated,invalid,conflicted,archived}S_K\in \{ candidate, valid, verified, unverified, outdated, invalid, conflicted, archived \}
KnowledgeRepository 保存状态。
但状态如何变化,应由 KnowledgeEngine、Verification、UpdateEngine 等组件计算或确认。
219.7 知识查询
KnowledgeRepository 的第二项核心职责是查询。
基本模型:
Query(C)→{K1,K2,…,Kn}Query(C)\rightarrow\{K_1,K_2,\ldots,K_n\}
其中:
- CC:查询条件;
- KiK_i:查询得到的 Knowledge Object。
常见查询:
按照知识ID查询
按照Subject查询
按照Predicate查询
按照Object查询
按照Subject + Predicate查询
按照Predicate + Object查询
按照状态查询
按照条件查询
按照时间查询
219.8 按ID查询
findById(ID)→KfindById(ID)\rightarrow K
PHP:
public function findById($id)
{
$sql = "
SELECT *
FROM knowledge
WHERE id = :id
LIMIT 1
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':id' => $id
));
$data = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$data) {
return null;
}
return $this->mapper->toDomain($data);
}
Repository 返回 Knowledge Domain Object,而不是直接把数据库数组向上层无限传播。
219.9 按Subject查询
例如:
Object-A
↓
所有相关知识
表示:
Query(S=Object-A)Query(S=Object\text{-}A)
PHP:
public function findBySubject($subject)
{
$sql = "
SELECT *
FROM knowledge
WHERE subject = :subject
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':subject' => $subject
));
return $this->mapRows($stmt);
}
这可以让 KnowledgeEngine 获得某个对象相关的知识集合。
219.10 按Predicate查询
例如:
supports
uses
depends_on
contains
located_in
belongs_to
可以:
Query(P)→{K}Query(P)\rightarrow\{K\}
PHP:
public function findByPredicate($predicate)
{
$sql = "
SELECT *
FROM knowledge
WHERE predicate = :predicate
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':predicate' => $predicate
));
return $this->mapRows($stmt);
}
219.11 按Subject与Predicate查询
这是知识查询中非常重要的一种方式:
Query(S,P)→{K}Query(S,P)\rightarrow\{K\}
例如:
Subject = Object-A
Predicate = supports
查询:
Object-A
↓
supports
↓
Knowledge Objects
PHP:
public function findBySubjectAndPredicate($subject, $predicate)
{
$sql = "
SELECT *
FROM knowledge
WHERE subject = :subject
AND predicate = :predicate
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':subject' => $subject,
':predicate' => $predicate
));
return $this->mapRows($stmt);
}
219.12 按Predicate与Object查询
也可以反向查询:
Query(P,O)→{K}Query(P,O)\rightarrow\{K\}
例如:
supports
↓
Method-M1
查询所有支持 Method-M1 的知识。
public function findByPredicateAndObject($predicate, $object)
{
$sql = "
SELECT *
FROM knowledge
WHERE predicate = :predicate
AND object_value = :object_value
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':predicate' => $predicate,
':object_value' => $object
));
return $this->mapRows($stmt);
}
219.13 三元知识查询
如果知识结构:
(S,P,O)(S,P,O)
完整查询:
Query(S,P,O)→KQuery(S,P,O)\rightarrow K
例如:
Object-A
supports
Method-M1
可以形成:
(Object-A,supports,Method-M1)(Object\text{-}A,supports,Method\text{-}M1)
PHP:
public function findByTriple($subject, $predicate, $object)
{
$sql = "
SELECT *
FROM knowledge
WHERE subject = :subject
AND predicate = :predicate
AND object_value = :object_value
LIMIT 1
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':subject' => $subject,
':predicate' => $predicate,
':object_value' => $object
));
$data = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$data) {
return null;
}
return $this->mapper->toDomain($data);
}
219.14 知识状态查询
可以查询:
Query(St)→{K}Query(S_t)\rightarrow\{K\}
例如:
public function findByState($state)
{
$sql = "
SELECT *
FROM knowledge
WHERE state = :state
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':state' => $state
));
return $this->mapRows($stmt);
}
这样可以分别读取:
verified
outdated
conflicted
candidate
等知识集合。
219.15 知识查询不等于知识判断
这是 Repository 必须保持的边界。
例如 Repository 查询:
Object-A
supports
Method-M1
只能说明数据库中存在这一知识记录。
KnowledgeEngine 还需要判断:
当前条件是否成立?
当前状态是否仍然适用?
知识是否过期?
是否存在冲突?
是否有更高优先级知识?
因此:
Query(K)≠Evaluate(K)Query(K)\neq Evaluate(K)
完整流程:
KnowledgeRepository
↓
Load Knowledge
↓
KnowledgeEngine
↓
Condition Evaluation
↓
Matching
↓
Verification
↓
Knowledge Result
219.16 知识更新
知识更新模型:
Kt+ΔK→Kt+1K_t+\Delta K\rightarrow K_{t+1}
其中:
- KtK_t:当前知识;
- ΔK\Delta K:经过计算和验证的知识变化;
- Kt+1K_{t+1}:更新后的知识。
例如:
原知识:
Kt:Method-M1requiresResource≥1K_t: Method\text{-}M1 requires Resource\geq1
实际执行以后发现:
Resource≥2Resource\geq2
经过 Diagnosis、Experience、Learning 和 Verification 后形成:
ΔK:Resource≥1→Resource≥2\Delta K: Resource\geq1 \rightarrow Resource\geq2
然后 UpdateEngine 将变化正式应用。
219.17 KnowledgeRepository不决定知识更新
正确架构:
Execution
↓
Result
↓
Feedback
↓
Diagnosis / Experience
↓
LearningEngine
↓
Knowledge Update Candidate
↓
Verification
↓
UpdateEngine
↓
KnowledgeRepository
↓
MySQL
因此:
LearningEngine≠KnowledgeRepositoryLearningEngine \neq KnowledgeRepository
并且:
KnowledgeRepository≠KnowledgeEngineKnowledgeRepository \neq KnowledgeEngine
三者分别承担:
KnowledgeEngine
→ 计算知识
LearningEngine
→ 计算应该学习什么
KnowledgeRepository
→ 保存已经确认的数据
219.18 知识最小更新原则
知识更新不能无条件覆盖。
例如:
K1:
Object-A supports Method-M1
如果只是知识状态变化:
verified→outdatedverified\rightarrow outdated
那么:
ΔK=ΔSt\Delta K=\Delta S_t
只更新状态。
如果只是 Condition 改变:
ΔK=ΔC\Delta K=\Delta C
只更新 Condition。
因此:
Kt+ΔK→Kt+1\boxed{ K_t+\Delta K\rightarrow K_{t+1} }
只修改实际发生变化且已经验证的字段。
219.19 知识更新条件
可以定义:
CanUpdateKnowledge=ValidChange∧Condition∧Rule∧VerificationCanUpdateKnowledge = ValidChange \land Condition \land Rule \land Verification
其中:
- ValidChange:确实发生变化;
- Condition:当前更新条件成立;
- Rule:知识更新规则允许;
- Verification:变化已经验证。
因此:
只有发现变化
并不意味着:
可以立即更新知识
必须经过验证。
219.20 知识冲突
知识之间可能发生冲突。
例如:
K1:M1 requires Resource≥1K_1: M1\ requires\ Resource\geq1
同时:
K2:M1 requires Resource≥2K_2: M1\ requires\ Resource\geq2
这并不能直接由 Repository 判断哪一个正确。
Repository 只能保存:
K1
K2
以及它们的状态。
ConflictEngine / KnowledgeEngine 负责计算:
K1
↕
Conflict
↕
K2
然后通过 Diagnosis、Decision、Learning、Update 等机制处理。
因此:
KnowledgeConflict≠RepositoryErrorKnowledgeConflict \neq RepositoryError
219.21 知识历史
知识变化需要保留历史。
可以建立:
knowledge_history
历史模型:
KH=(K,Sb,Sa,ΔK,R,T)KH=(K,S_b,S_a,\Delta K,R,T)
其中:
- KK:知识对象;
- SbS_b:更新前状态;
- SaS_a:更新后状态;
- ΔK\Delta K:知识变化;
- RR:变化原因;
- TT:变化时间。
例如:
Knowledge K1
Resource >= 1
↓
Learning
↓
Verification
↓
Resource >= 2
历史记录:
before:
Resource >= 1
after:
Resource >= 2
reason:
Verified Execution Feedback
这样能够追踪知识为什么改变。
219.22 KnowledgeMapper
KnowledgeMapper负责 Domain Object 与 Persistence Data 之间转换。
class KnowledgeMapper
{
public function toPersistence($knowledge)
{
return array(
'id' => $knowledge->getId(),
'subject' => $knowledge->getSubject(),
'predicate' => $knowledge->getPredicate(),
'object_value' => $knowledge->getObject(),
'condition' => $knowledge->getCondition(),
'state' => $knowledge->getState()
);
}
public function toDomain($data)
{
$knowledge = new Knowledge();
$knowledge->setId($data['id']);
$knowledge->setSubject($data['subject']);
$knowledge->setPredicate($data['predicate']);
$knowledge->setObject($data['object_value']);
$knowledge->setCondition($data['condition']);
$knowledge->setState($data['state']);
return $knowledge;
}
}
Mapper只负责映射。
它不负责:
知识推理
知识评分
知识冲突分析
知识学习
知识决策
219.23 KnowledgeRepository接口
兼容 PHP 5.6 / PHP 7:
interface KnowledgeRepositoryInterface
{
public function findById($id);
public function findBySubject($subject);
public function findByPredicate($predicate);
public function findBySubjectAndPredicate(
$subject,
$predicate
);
public function findByPredicateAndObject(
$predicate,
$object
);
public function findByTriple(
$subject,
$predicate,
$object
);
public function findByState($state);
public function save($knowledge);
public function update($knowledge);
public function exists(
$subject,
$predicate,
$object
);
}
该接口将知识持久化操作标准化。
219.24 MySQLKnowledgeRepository
基础实现:
class MySQLKnowledgeRepository
implements KnowledgeRepositoryInterface
{
protected $pdo;
protected $mapper;
public function __construct(
PDO $pdo,
KnowledgeMapper $mapper
) {
$this->pdo = $pdo;
$this->mapper = $mapper;
}
public function findById($id)
{
$sql = "
SELECT *
FROM knowledge
WHERE id = :id
LIMIT 1
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':id' => $id
));
$data = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$data) {
return null;
}
return $this->mapper->toDomain($data);
}
public function findBySubject($subject)
{
$sql = "
SELECT *
FROM knowledge
WHERE subject = :subject
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':subject' => $subject
));
return $this->mapRows($stmt);
}
public function findByPredicate($predicate)
{
$sql = "
SELECT *
FROM knowledge
WHERE predicate = :predicate
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':predicate' => $predicate
));
return $this->mapRows($stmt);
}
public function findBySubjectAndPredicate(
$subject,
$predicate
) {
$sql = "
SELECT *
FROM knowledge
WHERE subject = :subject
AND predicate = :predicate
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':subject' => $subject,
':predicate' => $predicate
));
return $this->mapRows($stmt);
}
public function findByPredicateAndObject(
$predicate,
$object
) {
$sql = "
SELECT *
FROM knowledge
WHERE predicate = :predicate
AND object_value = :object_value
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':predicate' => $predicate,
':object_value' => $object
));
return $this->mapRows($stmt);
}
public function findByTriple(
$subject,
$predicate,
$object
) {
$sql = "
SELECT *
FROM knowledge
WHERE subject = :subject
AND predicate = :predicate
AND object_value = :object_value
LIMIT 1
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':subject' => $subject,
':predicate' => $predicate,
':object_value' => $object
));
$data = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$data) {
return null;
}
return $this->mapper->toDomain($data);
}
public function findByState($state)
{
$sql = "
SELECT *
FROM knowledge
WHERE state = :state
ORDER BY id ASC
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':state' => $state
));
return $this->mapRows($stmt);
}
public function exists(
$subject,
$predicate,
$object
) {
$sql = "
SELECT COUNT(*) AS total
FROM knowledge
WHERE subject = :subject
AND predicate = :predicate
AND object_value = :object_value
";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array(
':subject' => $subject,
':predicate' => $predicate,
':object_value' => $object
));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return ((int)$row['total'] > 0);
}
public function save($knowledge)
{
$data = $this->mapper->toPersistence(
$knowledge
);
if ($this->exists(
$data['subject'],
$data['predicate'],
$data['object_value']
)) {
return false;
}
$sql = "
INSERT INTO knowledge
(
id,
subject,
predicate,
object_value,
condition,
state
)
VALUES
(
:id,
:subject,
:predicate,
:object_value,
:condition,
:state
)
";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute(array(
':id' => $data['id'],
':subject' => $data['subject'],
':predicate' => $data['predicate'],
':object_value' => $data['object_value'],
':condition' => $data['condition'],
':state' => $data['state']
));
}
public function update($knowledge)
{
$data = $this->mapper->toPersistence(
$knowledge
);
$sql = "
UPDATE knowledge
SET
subject = :subject,
predicate = :predicate,
object_value = :object_value,
condition = :condition,
state = :state
WHERE id = :id
";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute(array(
':id' => $data['id'],
':subject' => $data['subject'],
':predicate' => $data['predicate'],
':object_value' => $data['object_value'],
':condition' => $data['condition'],
':state' => $data['state']
));
}
protected function mapRows($stmt)
{
$knowledgeList = array();
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
$knowledgeList[] =
$this->mapper->toDomain($data);
}
return $knowledgeList;
}
}
以上代码用于说明 KnowledgeRepository 的工程结构。实际项目必须以真实数据库表结构、字段、主键策略、唯一约束以及现有 Repository 接口为准;这里没有对用户当前项目数据库进行实际连接和测试,因此不能把该代码描述为已经在实际系统中验证通过的版本。
219.25 知识保存后的读取验证
KnowledgeRepository 不应把:
INSERT成功
直接等同于:
Knowledge保存正确
更可靠的保存过程:
Save(K)→Insert→ReadBack→CompareSave(K) \rightarrow Insert \rightarrow ReadBack \rightarrow Compare
定义:
VerifySave=Exists∧IdentityMatch∧ContentMatchVerifySave = Exists \land IdentityMatch \land ContentMatch
其中:
- Exists:记录存在;
- IdentityMatch:知识 ID 正确;
- ContentMatch:Subject、Predicate、Object、Condition、State 等核心字段一致。
219.26 知识更新后的验证
更新同样需要 ReadBack。
Current Knowledge
↓
Update
↓
ReadBack
↓
Compare
↓
Verified
公式:
VerifyUpdate=Exists∧IdentityMatch∧ChangedFieldsMatchVerifyUpdate = Exists \land IdentityMatch \land ChangedFieldsMatch
例如:
before:
Resource >= 1
after:
Resource >= 2
读取数据库后必须确认:
condition = Resource >= 2
而不是只检查 SQL 是否返回成功。
219.27 知识保存与事务
如果一次学习过程产生:
Knowledge
Knowledge History
Evidence
Learning Record
则可能需要在 Service / TransactionManager 层协调事务:
Begin
↓
Save Knowledge
↓
Save Evidence
↓
Save Knowledge History
↓
Verify
↓
Commit
Repository 可以参与事务,但:
KnowledgeRepository≠TransactionManagerKnowledgeRepository \neq TransactionManager
事务边界应该由上层 Service 或专门的 TransactionManager 统一控制。
219.28 KnowledgeRepository与LearningEngine
完整学习链:
Feedback
↓
History
↓
Memory
↓
Experience
↓
LearningEngine
↓
Knowledge Update Candidate
↓
UpdateEngine
↓
KnowledgeRepository
因此:
Learning≠UpdateLearning \neq Update
同时:
Update≠PersistenceUpdate \neq Persistence
三层关系:
LearningEngine→UpdateEngine→KnowledgeRepositoryLearningEngine \rightarrow UpdateEngine \rightarrow KnowledgeRepository
分别回答:
LearningEngine
什么应该改变?
UpdateEngine
已经确认的变化如何应用?
KnowledgeRepository
如何把应用后的知识持久化?
219.29 KnowledgeRepository与Individual
Individual 是 ICAI 的综合认知主体。
其结构包含:
I=(O,K,C,M,B,MM,E,R,S)I=(O,K,C,M,B,MM,E,R,S)
其中 KK 就是 Knowledge。
因此 IndividualRepository 加载 Individual Aggregate 时,可以根据实际用例加载:
Individual
↓
Objects
↓
States
↓
Relations
↓
Knowledge
↓
Capabilities
↓
Methods
↓
Memory
↓
Experience
其中 KnowledgeRepository 负责:
Knowledge Load
Knowledge Save
Knowledge Update
IndividualRepository 负责整个 Individual Aggregate 的组合协调。
因此:
KnowledgeRepository⊂Individual Persistence StructureKnowledgeRepository \subset Individual\ Persistence\ Structure
但不意味着 KnowledgeRepository 继承 IndividualRepository。
219.30 KnowledgeRepository与CognitiveEngine
CognitiveEngine 的知识部分来自:
KnowledgeRepository
↓
Knowledge Facts
↓
KnowledgeEngine
CognitiveEngine 的输入已经定义为:
CI=(I,Of,Sf,Rf,Kf,C,Env,T,H,Ev,Ru)CI= (I,O_f,S_f,R_f,K_f,C,Env,T,H,E_v,Ru)
其中:
Kf=Knowledge FactsK_f=Knowledge\ Facts
因此:
KnowledgeRepository
↓
Kf
↓
CognitiveEngine
↓
KnowledgeEngine
↓
Knowledge Calculation Result
这保持了前面第209章 CognitiveEngine 输入输出定义的一致性。
219.31 KnowledgeRepository的数据结构
基础知识表可以采用类似结构:
CREATE TABLE knowledge (
id INT NOT NULL AUTO_INCREMENT,
subject VARCHAR(255) NOT NULL,
predicate VARCHAR(100) NOT NULL,
object_value TEXT NOT NULL,
condition TEXT,
state VARCHAR(50) NOT NULL,
created_at DATETIME,
updated_at DATETIME,
PRIMARY KEY (id)
);
可以进一步建立:
knowledge_evidence
knowledge_history
knowledge_relations
knowledge_conditions
用于保存:
知识依据
知识变化
知识关系
知识条件
但实际数据库结构必须根据工程需要确定,不能把示例表结构直接视为现有系统的正式数据库设计。
219.32 知识索引
如果 Knowledge 数量增加,查询性能会成为 Repository 的重要问题。
例如常用查询:
(S,P,O)(S,P,O)
可以考虑相应数据库索引。
例如:
INDEX idx_subject (subject)
INDEX idx_predicate (predicate)
INDEX idx_subject_predicate (subject, predicate)
对于完整三元关系查询,还可以根据实际字段长度和数据库版本设计组合索引。
这里仍然要区分:
Database Index≠Knowledge InferenceDatabase\ Index \neq Knowledge\ Inference
数据库索引只是提高查询效率,不产生认知推理。
219.33 知识查询缓存
在大量重复读取的情况下,可以增加缓存层:
KnowledgeRepository
↓
Cache
↓
MySQL
但缓存中的知识仍然属于持久化数据的读取优化。
不能因为缓存存在,就认为缓存数据自动成为当前有效知识。
必须考虑:
Cache Time
Knowledge State
Updated Time
Version
因此:
CachedKnowledge≠CurrentVerifiedKnowledgeCachedKnowledge \neq CurrentVerifiedKnowledge
除非经过有效性检查。
219.34 KnowledgeRepository与版本
知识具有明显的演化特点,因此可以加入版本概念:
KvK_v
例如:
K1 version 1
K1 version 2
K1 version 3
形成:
K1
↓
v1
↓
v2
↓
v3
这样能够支持:
知识追踪
知识回溯
知识比较
知识冲突分析
知识更新验证
但是版本管理本身仍然是持久化机制。
知识“为什么需要升级”仍由认知计算体系确定。
219.35 KnowledgeRepository完整调用链
正常读取:
Controller
↓
KnowledgeService
↓
KnowledgeRepository
↓
MySQL
↓
KnowledgeMapper
↓
Knowledge
↓
KnowledgeEngine
知识更新:
Execution
↓
Feedback
↓
Experience
↓
LearningEngine
↓
Knowledge Update Candidate
↓
UpdateEngine
↓
KnowledgeRepository
↓
MySQL
知识重新进入认知:
MySQL
↓
KnowledgeRepository
↓
Knowledge Facts
↓
KnowledgeEngine
↓
CognitiveEngine
219.36 KnowledgeRepository核心公式
知识保存:
Save(K)→Validate→Map→Persist→Verify\boxed{ Save(K) \rightarrow Validate \rightarrow Map \rightarrow Persist \rightarrow Verify }
知识查询:
Query(C)→PersistenceData→Knowledge\boxed{ Query(C) \rightarrow PersistenceData \rightarrow Knowledge }
知识更新:
Kt+ΔK→Validate→Update→Verify\boxed{ K_t+\Delta K \rightarrow Validate \rightarrow Update \rightarrow Verify }
知识更新条件:
CanUpdateKnowledge=ValidChange∧Condition∧Rule∧Verification\boxed{ CanUpdateKnowledge = ValidChange \land Condition \land Rule \land Verification }
知识有效性:
KnowledgeExists≠KnowledgeValid≠KnowledgeVerified\boxed{ KnowledgeExists \neq KnowledgeValid \neq KnowledgeVerified }
219.37 KnowledgeRepository与其他Repository的关系
到目前为止,Repository 层已经形成:
IndividualRepository
↓
ObjectRepository
↓
StateRepository
↓
RelationRepository
↓
KnowledgeRepository
它们分别保存:
Individual
Object
State
Relation
Knowledge
认知计算层则对应:
IndividualService
↓
ObjectEngine
↓
StateEngine
↓
RelationEngine
↓
KnowledgeEngine
形成:
DomainObject↔RepositoryDomainObject \leftrightarrow Repository
以及:
DomainObject↔EngineDomainObject \leftrightarrow Engine
两条不同的工程通道。
219.38 本章核心原则
原则一:Knowledge是独立Domain Object
Knowledge≠TextKnowledge\neq Text Knowledge≠DatabaseRecordKnowledge\neq DatabaseRecord
原则二:Repository不负责知识推理
KnowledgeRepository≠KnowledgeEngineKnowledgeRepository \neq KnowledgeEngine
原则三:知识查询不等于知识判断
Query(K)≠Evaluate(K)Query(K)\neq Evaluate(K)
原则四:知识存在不等于知识有效
Exists(K)≠Valid(K)Exists(K)\neq Valid(K)
原则五:知识有效不等于已经验证
Valid(K)≠Verified(K)Valid(K)\neq Verified(K)
原则六:知识更新遵循最小更新原则
Kt+ΔK→Kt+1K_t+\Delta K\rightarrow K_{t+1}
原则七:知识更新必须具有依据
CanUpdateKnowledge=ValidChange∧Condition∧Rule∧VerificationCanUpdateKnowledge = ValidChange \land Condition \land Rule \land Verification
原则八:知识变化应该可追溯
KnowledgeChange→KnowledgeHistoryKnowledgeChange \rightarrow KnowledgeHistory
原则九:LearningEngine不直接承担持久化
LearningEngine→UpdateEngine→KnowledgeRepositoryLearningEngine \rightarrow UpdateEngine \rightarrow KnowledgeRepository
原则十:MySQL只负责数据存储
MySQL≠CognitiveEngineMySQL \neq CognitiveEngine
219.39 本章总结
KnowledgeRepository 将 ICAI 中的知识对象正式接入持久化体系。
其核心职责:
KnowledgeRepository=Save+Query+Update\boxed{ KnowledgeRepository = Save + Query + Update }
知识保存:
Knowledge→Validate→Persist→VerifyKnowledge \rightarrow Validate \rightarrow Persist \rightarrow Verify
知识查询:
QueryCondition→MySQL→KnowledgeQueryCondition \rightarrow MySQL \rightarrow Knowledge
知识更新:
Kt+ΔK→Validate→Update→VerifyK_t+\Delta K \rightarrow Validate \rightarrow Update \rightarrow Verify
完整知识生命周期:
Fact
↓
KnowledgeEngine
↓
Knowledge Candidate
↓
Verification
↓
Learning / Update
↓
KnowledgeRepository
↓
MySQL
↓
KnowledgeRepository
↓
Knowledge
↓
KnowledgeEngine
↓
CognitiveEngine
最终形成明确的职责分工:
KnowledgeEngine=知识计算\boxed{ KnowledgeEngine=知识计算 } LearningEngine=知识学习变化计算\boxed{ LearningEngine=知识学习变化计算 } UpdateEngine=知识更新应用\boxed{ UpdateEngine=知识更新应用 } KnowledgeRepository=知识持久化\boxed{ KnowledgeRepository=知识持久化 } MySQL=知识数据存储\boxed{ MySQL=知识数据存储 }
因此:
Knowledge→KnowledgeEngine→LearningEngine→UpdateEngine→KnowledgeRepository→MySQL\boxed{ Knowledge \rightarrow KnowledgeEngine \rightarrow LearningEngine \rightarrow UpdateEngine \rightarrow KnowledgeRepository \rightarrow MySQL }
读取方向则为:
MySQL→KnowledgeRepository→Knowledge→KnowledgeEngine→CognitiveEngine\boxed{ MySQL \rightarrow KnowledgeRepository \rightarrow Knowledge \rightarrow KnowledgeEngine \rightarrow CognitiveEngine }
至此,ICAI 已经形成从 Individual → Object → State → Relation → Knowledge 的基础认知数据持久化链条。知识不再只是静态数据库记录,而成为可以被 Engine 计算、被 Learning 更新、被 Update 应用、被 Repository 持久化,并重新进入 CognitiveEngine 的结构化认知数据。