Archive:Ontology import/zh-hans

From semantic-mediawiki.org
< Archive:Ontology import
Ontology importArchive:Ontology import/zh-hans


This page contains outdated information and is thus OBSOLETE!
本文档页面适用于SMW从0.1版到0.7的所有版本。
      其他语言: en

Archive:Ontology import zh-hans 0.1 0.7


Semantic MediaWiki具有向Semantic MediaWiki安装当中导入本体的功能(仍处于beta测试阶段,且1.0版中已禁用)。 为了有所用处,所要导入的本体必须遵循特定的格式。 下文将阐述的就是,用于从本体(或者,实际上还有其他格式)当中导入数据的一种备选方法。

本体格式[edit]

本体元素,即类、属性和个体,均应当具有标签。这些标签将用于命名关系、类别和文章页面,同时也用于在文章页面上创建合适的标注,即具型链接(typed links)或分类链接(categorization links)。导入的映射自然遵循导出导出的映射,因此它看起来像如下的样子:

OWL构造 OWL构造中文名称 Semantic MediaWiki Semantic MediaWiki元素中文名称
Class Category 类别
Datatype property 数据类型属性 Properties and types 属性
Object property 对象属性 Properties and types also (??) 属性
Class instantiation 类实例化 Page categorization (e.g. [[Category:X]]) 页面分类
Subclass of 是……的子类 Category subcategorization (e.g. [[Category:X]] on a category page) 类别细分
Individual 个体 Article (in Main namespace) 文章(位于主命名空间Main当中)
Instantiated datatype property 实例化数据类型属性 Attribute annotation (e.g. [[X::Y]]) 特征属性
Instantiated object property 实例化对象属性 Typed link (e.g. [[X::Y]]) 具型链接

请注意:本体在RDF-序列化当中需要采用OWL DL格式,而不仅仅是一般的RDF或者RDFS,而且为了能够加以识别,必须同样对所有的属性和类都加以定义。 导入的仅仅是显式的声明,也就是说,不会进行推理。 因此,即便是您可以依据本体推断出亚当是男人,除非男人被定义为一个OWLClass,且其本体当中的确存在这样一个三元组,否则不会将亚当归在男人类别Category:Man当中。 如果希望导入隐含的声明,则必须首先使其变为显式。可以利用任何的推理机来具体化此类声明。

另外要注意的是,来自OWL DL的所有进一步的构造,如逆向关系、互补类、类并集等等,都不会被导入。如果希望在Semantic MediaWiki当中使用更为复杂的本体,请查阅出版物ow:Reusing Ontological Background Knowledge in Semantic Wikis

工作机制[edit]

在页面Special:Import ontology,可以上载本体文件。该页面仅供具有管理员权限的用户使用。在您选定了本体文件之后,系统将会(利用RAP,在此表示感谢!)对它进行解析,系统将会呈现给您一张包含所有可导入声明的列表,尤其是那些当前维基站点当中还没有的声明(尽管这一显示手段还存在着些缺陷,我们对此表示歉意)。这里,您可以选择所要导入的每项声明,而且还可以输入要与导入内容一起导入的少量文字(例如,将会解析某一消息的某个模板会告诉用户,这些信息导入自特定的本体)。

当您选定了合适的声明并且设置了其他的选项之后,点击页面最底部的导入按钮并等待即可。 片刻之后,这些声明就应当已经被导入进行了(请查看最近的变更情况)。

请注意:这部分目前仍有些缺陷。您可能希望首先尝试本体的一些较小的部分,甚至是单个的声明,以便查看是否像您自己所期望的那样发挥了作用。

备选导入手段[edit]

作为当前实验功能的一种备选手段,您可以利用预处理工具,采用SMW属性的维基文本,来标注维基页面,然后再采用MediaWiki导入工具来导入这些页面。

一种更为稳健的本体导入方法就是,利用Python Wikipedia Bot之类的框架。 该框架应当也可以与其他类型的维基站点配合工作,而不仅仅是Wikipedia;但是,要获得对于您的维基站点的访问权,还必须创建一个新的家族文件(family file)。在这种情况下,您就不仅限于使用OWL DL兼容型本体了。

例如,在Ontoworld维基站点之上,我们从ow:ESWC2006本体里面导入了代表名单(delegates list)。 我们可以这样来简要描述这个程序:其利用rdflib库来进行RDF解析,利用Wikipedia Bot框架来与Wikipedia配合工作。它利用RDF来创建模板。它也可以创建其中含有具型链接(typed links)的句子(关于一个这样的例子,可参见代码尾部附近),或者如果所要添加的三元组早已包含其中(因而可予以忽略)的话,首先要检查该页面的输出。

from rdflib import Graph, URIRef, Literal, Namespace, RDF
import wikipedia, login, category

family = "ontoworld" # 请注意:您需要安装设置合适的家族文件(family file)

i = Graph()

i.bind("foaf", "http://xmlns.com/foaf/0.1/")
RDF = Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#")
RDFS = Namespace("http://www.w3.org/2000/01/rdf-schema#")
FOAF = Namespace("http://xmlns.com/foaf/0.1/")
i.load("eswc.rdf")

ow = wikipedia.Site('en')
login.LoginManager('password', False, ow)

unchanged = list()   # 旨在保护那些早已拥有一个页面者

# 遍历所有具有Person类型者
# (注意:仅仅是显式的断言 -- rdflib 在此并不进行推理!)
for s in i.subjects(RDF["type"], FOAF["Person"]):
        for n in i.objects(s, FOAF["name"]):  # 读取姓名
            p = wikipedia.Page(ow,n)          # 获取带有该姓名的页面
            if p.exists():
                unchanged.append(n)
            else: # 创建实例化模板
                h = '{{Person|'   '\n'
                h  = ' Name='   n
                
                for hp in i.objects(s, FOAF["workplaceHomepage"]):
                    h  = '|'   '\n'
                    hp = hp[7:]
                    h  = ' Homepage='   hp
                    if len(hp)>23: # 如果页面名称过长,
                        h  = '|'   '\n'
                        if hp.find("/"): # 则将其变短
                            hp = hp[0:hp.find("/")]
                        h  = ' Homepage label= at '   hp

                for hp in i.objects(s, RDFS["seeAlso"]):
                    h  = '|'   '\n'
                    h  = ' FOAF='   hp
                h  = '\n'   '}}' # 结束Person模板

                # write a sentence
                h  = '\n'   "'''"   n   "''' attended the [[delegate at::ESWC2006]]."

                # add a category
                h  = '\n'   '\n'   '[[Category:Person]]'
                print n   ' changed'
                p.put(h, 'Added from ontology')

wikipedia.stopme()
print unchanged

只要您拥有全面的Python技能,您基本上就可以解析任何的机读型文档并采用自己喜欢的任何方式来处理它。 截至2006年,只要本体导入功能仍不完善,那么这就是将数据导入本体的推荐方法(尤其是因为与本体导入将来所可能的情况相比,这种方法允许您更加自由得多地声明事实和复用模板)。

还有另外一份对于利用脚本导入数据的描述。