`
lcf11824
  • 浏览: 87959 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Building Semantic Web Applications--搭建语义网应用程序

阅读更多

 

wiki地址:http://protegewiki.stanford.edu/wiki/BuildingSemanticWebApplications 

Main article: ProtegeOWL_API_Programmers_Guide

Building Semantic Web Applications--搭建语义网应用程序

可以使用Protege-OWL API 构建独立的应用程序。这些应用程序可以从语义网(Semantic Web)上下载本体,对这些本体进行查询或者编辑,对实例和类进行归纳划分,并且将结果本体写入文件中。语义网应用的一些方法和架构由Holger Knublanch在他的论文中提出。下面的图是从论文中截取的,主要描述了一个应用的典型架构。

 

 

 

上图的架构,将整个应用系统划分为两个部分:语义网层,逻辑层

语义网层:存储大量可用的领域本体,其他用户可以使用web Service获取网络上的本体。

逻辑层:将使用的本体封装成应用中对应的具体java类(针对应用构建模型),底层拥有各种推理机可以进行推理。这里可以这么理解,将语义网理解成一个巨大的数据库,而图中Customer.javaActivity.java可以理解成我们平时的应用中的Model

其实这里还隐藏了一个与用户的交互层,即View。使用Jsp编写,通过web service或者servlet等方式调用逻辑层提供的服务。

Wiki中给出了下面的例子:

1. 有一个Purchase本体,每个purchase包含了customerproduct(这两个概念定义在别的本体中)。

2. 我们需要处理某个customer,则直接调用本体的代码如下。

 

OWLNamedClass customerClass = owlModel.getOWLNamedClass("Customer");
OWLDatatypeProperty firstNameProperty = owlModel.getOWLDatatypeProperty("firstName");
OWLIndividual myCustomer = owlModel.getOWLIndividual("Customer42");
String firstName = (String) myCustomer.getPropertyValue(firstNameProperty);

 这种调用方式容易造成混乱,直接通过字符串处理本体是非常不合理的。

如果我们需要统计用户的个数,则代码如下

 

private static float getPurchasesSum(RDFIndividual customer) {
    OWLModel owlModel = customer.getOWLModel();
    float sum = 0;
    RDFProperty purchasesProperty = owlModel.getRDFProperty("purchases");
    RDFProperty productProperty = owlModel.getRDFProperty("product");
    RDFProperty priceProperty = owlModel.getRDFProperty("price");
    Iterator purchases = customer.listPropertyValues(purchasesProperty);
    while(purchases.hasNext()) {
        RDFIndividual purchase = (RDFIndividual) purchases.next();
        RDFIndividual product = (RDFIndividual) purchase.getPropertyValue(productProperty);
        Float price = (Float) product.getPropertyValue(priceProperty);
        sum += price.floatValue();
    }
    return sum;
}

 3封装为应用的model

编写一个接口,完成Customer需要的功能,向外部应用提供这样的接口可以提高程序的安全性,也符合面向对象的原则。

 

public interface Customer {
    String getFirstName();
        
    void setFirstName(String value);
    ...
    float getPurchasesSum();
}

 编写一个默认用户类,实现这些方法。每个用户是本体中的一个实例,所以该类可以从api提供的本体实例类继承。

 

package com.demo.model.impl;
    public class DefaultCustomer extends DefaultOWLIndividual implements Customer {
    
    public DefaultCustomer(KnowledgeBase kb, FrameID id) {
        super(kb, id);
    }        
    public String getFirstName() {
        RDFProperty property = getOWLModel().getRDFProperty("firstName");
        return (String) getPropertyValue(property);
    }        
    public void setFirstName(String value) {
        RDFProperty property = getOWLModel().getRDFProperty("firstName");
        setPropertyValue(property, value);
    }

}

 另外,编写一个工厂类MyFactory用于实现向本体中添加新的数据。

 

package edu.stanford.smi.protegex.owlx.examples.javaDemo.model;

import edu.stanford.smi.protegex.owl.model.OWLModel;
import edu.stanford.smi.protegex.owl.model.RDFSNamedClass;

/**
 * Generated by Protégé-OWL (http://protege.stanford.edu/plugins/owl).
 *
 * @version generated on Mon Feb 21 10:53:08 EST 2005
 */
public class MyFactory {

    private OWLModel owlModel;

    public MyFactory(OWLModel owlModel) {
        this.owlModel = owlModel;
    }

    public RDFSNamedClass getCustomerClass() {
        final String uri = "http://www.owl-ontologies.com/javaDemo.owl#Customer";
        final String name = owlModel.getResourceNameForURI(uri);
        return owlModel.getRDFSNamedClass(name);
    }

    public Customer createCustomer(String name) {
        final RDFSNamedClass cls = getCustomerClass();
        return (Customer) cls.createInstance(name).as(Customer.class);
    }

    public RDFSNamedClass getPurchaseClass() {
        final String uri = "http://www.owl-ontologies.com/javaDemo.owl#Purchase";
        final String name = owlModel.getResourceNameForURI(uri);
        return owlModel.getRDFSNamedClass(name);
    }

    public Purchase createPurchase(String name) {
        final RDFSNamedClass cls = getPurchaseClass();
        return (Purchase) cls.createInstance(name).as(Purchase.class);
    }

    public RDFSNamedClass getProductClass() {
        final String uri = "http://www.owl-ontologies.com/javaDemo.owl#Product";
        final String name = owlModel.getResourceNameForURI(uri);
        return owlModel.getRDFSNamedClass(name);
    }

    public Product createProduct(String name) {
        final RDFSNamedClass cls = getProductClass();
        return (Product) cls.createInstance(name).as(Product.class);
    }
}

 4改进后

可以直接使用提供的接口对本体中的用户进行操作,整个代码结构非常清晰简洁。

 

private static Purchase createPurchase(Customer customer, Product product, String date) {
    OWLModel owlModel = customer.getOWLModel();
    Purchase purchase = new MyFactory(owlModel).createPurchase(null);
    purchase.setCustomer(customer);
    purchase.setProduct(product);
    RDFSDatatype xsdDate = owlModel.getRDFSDatatypeByName("xsd:date");
    purchase.setDate(owlModel.createRDFSLiteral(date, xsdDate);
    return purchase;
}
 

这是一个简单应用的基本框架。最近也正好在做本体相关的工作,但是应用中出现的类和实例非常之多,主要涉及的也是推理的工作,真正直接对本体各个数据进行直接改动的工作还是比较少。但是这个思维方式还是非常值得借鉴的,觉得很经典,其实也很像MVC在后续的工作中或许也会涉及到这样的应用,这里先初步学习记录。

 

分享到:
评论
1 楼 ahulihu 2012-11-05  

一个问题,在什么应用场景需要语义网应用程序。
你所接触的引用中个,有基于语义网的吗?如果有,语义网如何构建,如何推理?

相关推荐

    Semantic-UI-master.zip

    总之,"Semantic-UI-master.zip" 文件是 Semantic UI 的完整源码,包含了构建高质量、语义化的用户界面所需的所有资源。无论是初学者还是经验丰富的开发者,都可以从中受益,快速构建美观且易于维护的网页应用。

    formsy-semantic-ui-react, 响应组件的语义用户界面形式的Formsy响应包装器.zip

    formsy-semantic-ui-react, 响应组件的语义用户界面形式的Formsy响应包装器 formsy-semantic-ui-react 快速创建 formsy,使用semantic-ui-react窗体组件的子窗体来响应表单。安装npm install (or yarn add) formsy-...

    前端开源库-semantic-ui-css

    综上所述,"前端开源库-semantic-ui-css" 是一个强大的前端设计工具,旨在简化和加速 Web 开发过程,通过语义化的 CSS 类名提供美观且易用的用户界面。无论你是新手还是经验丰富的开发者, Semantic UI CSS 都能帮助...

    SemanticUI​后台模板Semantic-Admin-Template.zip

    Semantic-Admin-Template 是 Semantic UI 的后台模板。 标签:Semantic

    前端开源库-semantic-release-plugin-decorators

    `semantic-release-plugin-decorators`是一个专为前端开发者设计的工具,它致力于自动化JavaScript项目的版本发布流程,遵循语义化版本(`Semantic Versioning`)规范。语义化版本是一种广泛接受的版本命名策略,用于...

    Semantic-UI-CSS-master.zip_semantic_semantic css

    在“Semantic-UI-CSS-master.zip”这个压缩包中,我们找到了核心的“Semantic-UI-CSS-master”项目,它包含了构建高效、美观且语义化的网站所需的所有CSS资源。下面,我们将深入探讨Semantic UI CSS的关键概念、设计...

    Semantic-UI-Docs, 语义用户界面的官方文档.zip

    Semantic-UI-Docs, 语义用户界面的官方文档 语义文档这里文件夹包含用于生成 semantic-ui.com的static 网站的模板。:如何使用安装插件,用于创建网站的HTML的static 站点生成器。npm install -g docpaddocpad in

    predictpb.py 适用于Semantic-Segmentation-Suite

    Semantic-Segmentation-Suite pb文件预测,根据训练情况更改代码

    前端项目-semantic-ui-calendar.zip

    这意味着开发者可以利用这个模块来构建具有美观日历界面的Web应用,例如用于事件安排、日期选择或者时间管理等场景。 标签“前端项目”指示了这个压缩包的内容主要面向Web前端开发人员,他们可能需要在自己的项目中...

    semantic-release-monorepo:将语义发布的自动发布应用于monorepo

    语义释放单记录 将自动发布应用于monorepo。 为什么 semantic-release的默认配置假定GitHub存储...在每个monorepo软件包中, semantic-release-monorepo semantic-release和semantic-release-monorepo必须是可访问的。

    前端项目-semantic-ui-react.zip

    npm install semantic-ui-react semantic-ui-css # 或者 yarn add semantic-ui-react semantic-ui-css ``` 安装完成后,我们需要在应用入口文件中引入 Semantic UI React 和其样式文件: ```jsx import 'semantic-...

    前端开源库-semantic-release-github-pr

    前端开源库-semantic-release-github-pr语义发布github pr,a

    Semantic-Segmentation-master_keras_yolov3_

    标题中的"Semantic-Segmentation-master_keras_yolov3_"暗示了这是一个关于语义分割(Semantic Segmentation)的项目,使用了Keras框架,并且结合了YOLOv3(You Only Look Once version 3)的目标检测算法。...

    Semantic-UI-CSS-master.zip_Semantic-UI-master_semantic css_steep

    "Semantic-UI-CSS-master.zip" 和 "Semantic-UI-master" 都是与Semantic UI相关的项目,其中前者可能包含了框架的CSS源码,后者可能是整个框架的源码仓库,包括JavaScript、LESS或SASS文件等。 "steep" 可能指的是...

    The Semantic Web(9-16) 语义网国外教材(下)

    第16章,"应用案例与未来趋势",展示了语义网在实际场景中的应用,如科学出版、医疗保健、电子商务等,并探讨了语义网的未来发展和挑战。 通过学习这些章节,读者不仅能理解语义网的基本原理,还能掌握其在实际项目...

    Semantic-Segmentation-Editor.txt

    语义分割标注工具Semantic-Segmentation-Editor所需要的依赖软件,因为网络不能下载,因此可以在这儿进行离线下载使用安装。

    python semantic web lib-pymantic

    Python语义网库-Pymantic是一个相对较新的库,专为Python 2.5设计,它利用了RDFLib 3.x的功能,以支持语义网技术。...通过学习和掌握Pymantic,开发者可以更好地利用语义网的力量,提升他们的应用程序和数据处理能力。

    semantic-ui-calendar-react:Datepicker React组件基于语义UIReact组件

    npm i semantic-ui-calendar-react CDN < script src =" https://cdn.jsdelivr.net/npm/semantic-ui-calendar-react@latest/dist/umd/semantic-ui-calendar-react.js " > </ script > 然后,您可以像...

    前端开源库-semantic-release-tamia

    【前端开源库-semantic-release-tamia】是一个专为前端开发者设计的开源工具,它集成了语义化版本管理策略,旨在自动化JavaScript项目的版本发布流程。这个库名为“tamia”,意味着它提供了一套定制化的脚本来实现...

    Semantic Web Technologies - Trends and Research in Ontology-based Systems(2006).pdf

    本书聚焦于语义网(Semantic Web)的核心技术及其在本体(Ontology)基础上的发展趋势与研究进展,为读者提供了深入理解语义网技术的重要资源。 ### 语义网(Semantic Web) 语义网是万维网联盟(W3C)提出的一个概念...

Global site tag (gtag.js) - Google Analytics