База знаний это набор фактов. Фактом может быть утверждение: Москва является столицей России. Факты могут иметь формат RDF триплета:
_:Москва _:являетсяСтолицей _:Россия
Данные/триплеты могут быть связные, например:
_:Россия _:располагаетсяНаМатерике _:Евразия
и получается уже маленькая База Знаний:
_:Москва _:являетсяСтолицей _:Россия
_:Россия _:располагаетсяНаМатерике _:Евразия
Такие триплеты имеют формат графа. Чем больше триплетов, тем больше База Знаний. Откуда брать такие триплеты или как моделировать это уже другой вопрос. Можно извлечь из других Баз Знаний (dbpedia, freebase, etc). Можно самостоятельно извлекать именованные сущности из не структурированных данных (например СМИ, форумы), но это не тривиальная задача, однако выполнимая.
Хранить это можно как в текстовых файлах в виде представленных выше триплетах, так и в NoSQL базах данных.
Семантическая сеть оперирует фактами/триплетами. Найти ответ на вопрос в ней можно следующим образом:
question = (my_apartment, has, what)
knowledge = (
(I, own, my_apartment),
(my_apartment, has, my_computer),
(my_apartment, has, my_bed),
(my_apartment, is_in, Philadelphia)
)
for each statement in knowledge {
if ((statement.subject == question.subject
or question.subject == what) {
and (statement.predicate == question.predicate
or question.predicate == what)
and (statement.object == question.object
or question.object == what))
call FoundAnswer(statement)
}
}
Output:
Answer: my_apartment has my_computer
Answer: my_apartment has my_bed