构建知识图谱技术:产品视角下的知识图谱构建流程与技术理解
构建知识图谱技术:产品视角下的知识图谱构建流程与技术理解图:三元组要让计算机理解三元组,就必须对其进行规范化定义,这就引出了RDF(Resource Description Frame 资源描述框架)和Owl语言(Ontology Web Language 网络本体语言)等定义标准。Neo4j还提供了大规模可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图,可以扩展到多台机器并行运行。Neo4j中实现的图查询语言是Cypher Quary Language,简称CQL。除了图结构,现在大部分知识图谱中采用的结构是三元组,是一种更容易存储、识别和利用的的数据结构。简单来说,三元组就是知识图谱中的两个节点和一条边组成的关系对,或者说是一个实体。
如果按照简化过的知识图谱定义,图谱中的两个节点和一条边就构成了一个实体,比如“水泥是建材的一个子类”,就可以表示为“水泥”和“建材”两个节点,以及一条由水泥指向建材的,属性为子类的有向边。
在图结构中,这样的边是可以快速添加的,而节点也都是可以快速添加的,这比传统的关系型数据库具有更高的灵活性,也更容易建模,修改的时候也不会造成太大的工作量。
图结构有专门的图数据库,目前知识图谱中应用的比较成熟的图数据库有Neo4j。Neo4J是一个近年来发展起来的图形化数据库,相对于关系型数据库来说,图数据库善于处理大量复杂、互连接、低结构化的数据,图数据库中通过节点可直接查询,而关系型数据库中,需要通过多张表连接查询,产生性能上的问题。
Neo4J尤其对图算法进行了改进,查询和修改的速度较快,性能也可接受。
Neo4j还提供了大规模可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图,可以扩展到多台机器并行运行。Neo4j中实现的图查询语言是Cypher Quary Language,简称CQL。
除了图结构,现在大部分知识图谱中采用的结构是三元组,是一种更容易存储、识别和利用的的数据结构。
简单来说,三元组就是知识图谱中的两个节点和一条边组成的关系对,或者说是一个实体。
要让计算机理解三元组,就必须对其进行规范化定义,这就引出了RDF(Resource Description Frame 资源描述框架)和Owl语言(Ontology Web Language 网络本体语言)等定义标准。
图:三元组
RDF(Resource Description Frame 资源描述框架)是一个使用XML语法来表示的资料模型(Data model),是由W3C制定并推广的一套用于描述实体和关系的标准。
RDF使用统一资源标识(URI,Uniform Resource Indentifiers)来命名来标识资源,任何一个事物或概念,只要按照RDF表示法描述都可以成为一个资源。
有了资源之后,RDF使用属性和属性值来描述资源,属性和属性值定义了资源的形态。
特定的资源以一个被命名的属性与相应的属性值来描述,称为一个RDF陈述,其中资源是主词(Subject),属性是述词(Predicate),属性值则是受词(Object),需要注意的是,陈述的受词除了可能是一个字符串,也可能是其它的资料形态或是一个资源。
一个RDF实例<S,P,O>(也即<主语,谓语,宾语>)就是一个三元组,比如<水泥,组成,混凝土>,RDF是抽象的数据模型,支持不同的序列化格式,例如RDF/XML、Turtle和N-Triple,其中<水泥,组成,混凝土>的RDF/XML具体的表示如下:
每一个RDF实例都可以看成一个知识单元,也是图谱的最小组成部分。
RDF使用的是开放世界假设,即三元组<水泥,组成,混凝土>对于计算机而言意味着混凝土至少有水泥这一种组成材料,而不是只有水泥这一种组成材料。
RDF有一些基本词汇如rdf:
type用于指定资源类型,但如果想描述某个领域里类别和属性的层级结构、包含关系等是不够的。
比如限定<梁思成,毕业于,清华大学>,RDF可以表示梁思成和清华大学这两个实体有哪些属性,以及梁思成毕业于清华大学,但我们想定义梁思成是人,清华大学是地点,人有哪些属性,地点有哪些属性,人和地点之间存在什么关系,RDF就无法表示了。
为了解决这一问题,W3C推出RDF Schema(RDFs),在RDF词汇基础上拓展了一套数据建模词汇来描述数据的模式层,对RDF中的数据进行约束与规范。
Schema英文翻译为纲要、图示、构架,MySql中的Database又称Schema,其实就是定义了一类数据有哪些属性,RDFS可以方便的拓展类的属性。
RDF Schema 不提供实际的应用程序专用的类和属性,而是提供了描述应用程序专用的类和属性的框架,RDFS本质上就是RDF词汇的一个扩展,比如RDFs中有两个非常重要的词汇domain和range。
Domain表示属性的域,即属于哪个类别,range表示属性的取值类型,也就是,domain限定了属性的定义域,range限定了属性的值域。
举个例子,在三元组<职业,是,土木工程师>中,可以用domain限定“职业”的类别是“人”,用range限定“职业”的取值范围是字符串String。具体表示如下:
这里还有一个要点,即RDFS不是根据对象可能具有的属性来定义类,而是根据属性可能归纳的类型和取值范围来定义。
具体来说,我们可以给职业“Career”归属到人“Person”的类别下,而不是像经典的面向对象编程中采用的先定义类person,再定义Career。
RDFS的这个要点使得我们可以在不需要重新修改这些类的原始描述的情况下,完成属性的添加,人们可以很容易的向已经定义的类中增加额外的属性,这也是以属性为中心构建类型系统的优势。
虽然RDFs对RDF的词汇进行了拓展,但其表达能力还是比较弱。
比如RDFs无法说明两个类或者多个类是否等价,或者两个类是否不相交(比如人的子类男人和女人不相交),或者属性特性的描述,比如传递性,逆属性(大于的逆关系是小于)。
为了进一步提高建模和推理能力,网络本体语言 OWL(Web Ontology Language)又被提出,其实也可以看做RDFS的进一步拓展。
OWL不但具有快速,灵活的数据建模能力,还可以通过一套定义的词汇帮助计算机进行推理。以下是owl中的一些重要词汇:
通过以上图表中的词汇,owl可以进行部分推理与展示,比如A的祖先是B,B的祖先是C,自然可以得到A的祖先是C。通过不同词汇的应用,相比于RDFs,owl的表示能力和推理能力有了很大的进步。
RDFS/OWL序列化方式和RDF没什么不同,其实在表现形式上,它们就是RDF。
有了RDF数据库,还需要了解其查询语言。SPARQL提供了查询RDF数据的标准语法,查询规则以及结果返回形式。其实SPARQL和SQL很像,只是关键字的定义不同,以下是一个例子: