有一种数据模型可以让你完美地表达这种信息,那就是 RDF/RDFS 。 RDF 是 W3C 标准,用于基于三元组(主语、谓语、宾语)和 URI 对数据进行建模;和 RDFS 等允许您描述类层次结构和属性层次结构。好消息是有许多库可以帮助您创建和查询此类数据。
例如,如果我想说特定文档 Lion 属于 Animal 类,而 programmer 属于 Geek 类,我可以说:
doc:lion rdf:type class:mamal .
doc:programmer rdf:type class:Geek .
现在我可以声明类的层次结构,并说每个哺乳动物都是动物,每个动物都是生物。
class:mamal rdfs:subClassOf class:animal .
class:animal rdfs:subClassOf class:LivingThing .
而且,每个极客都是人,每个人都是生物:
class:geek rdfs:subClassOf class:human .
class:human rdfs:subClassOf class:LivingThing .
有一种语言,类似于SQL,叫做SPARQL 来查询这种数据,例如如果我发出查询:
SELECT * WHERE {
?doc rdf:type class:LivingThing .
}
其中?doc 是一个变量,它将绑定class:LivingThing 的事物类型。我会得到这个查询的结果doc:lion 和doc:programmer,因为数据库技术将遵循RDFS 的语义,因此通过计算类的闭包,它会知道doc:lion 和doc:programmer 是class:LivingThing。
以同样的方式查询:
SELECT * WHERE {
doc:lion rdf:type ?class .
}
会告诉我doc:lion 是rdf:type 的class:mamal class:animal 和class:LivingThing。
就像我刚才解释的那样,使用 RDFS,您可以创建属性层次结构,然后说:
doc:programmer doc:studies doc:computerscience .
doc:lion doc:instint doc:hunting .
我们可以说doc:skill 和doc:instint 都是doc:knows 的子属性:
doc:studies rdfs:subPropertyOf doc:knows .
doc:instint rdfs:subPropertyOf doc:knows .
使用查询:
SELECT * WHERE {
?s doc:knows ?o .
}
我们会知道狮子会打猎,程序员会计算机科学。
大多数 RDF/RDFS 数据库都可以轻松处理您在问题中提到的元素数量,并且有很多选择可以开始。如果你是 Java 人,你可以看看 Jena,还有适用于 .Net lije this one 或 Python 的框架 RDFLIB
但最重要的是,请查看 CMS 的文档,因为可能有插件可以将元数据导出为 RDF。例如,Drupal 在这种情况下是相当先进的(参见http://drupal.org/project/rdf