与研究语义网的同行们分享一下上半年做的一个东西,它是支持BLOB操作的Jena框架扩展——JenaBLOB,已在GitHub上开源,欢迎提出宝贵意见!

众所周知,Jena是不支持BLOB类型的Literal的,但根据RDF强大的模型来说,它并不排除属性值可以是BLOB类型。JenaBLOB用于实现这种功能。

托管地址:https://github.com/bluejoe2008/jena-blob

jena-blob

write/read/query BLOBs(binary large objects) in Jena framework

jena-blob enables RDF stores to manage both structured data and unstructred data

visit https://github.com/bluejoe2008/jena-blob/blob/master/test/JenaBlobTest.java for
example usage

create
blob objects in Java

a blob object is always accessed via an InputStream interface. BlobLiteral class provides several create() methods to create blob objects:

  • public static Literal create(byte[] bytes) : creates a blob from a byte array
  • public static Literal create(File file) : creates a blob which contents come from a local file
  • public static Literal create(InputStreamSource source) : creates a blob which contents come from a org.springframework.core.io.InputStreamSource
  • public static Literal create(String text) : create a blob from a byte array of a string

the following codes illustrate how to add a BLOB as a literal:

    SAMPLE_MODEL = ModelFactory.createDefaultModel();
    Literal lit = BlobLiteral.create(new File("./1.gif"));
    SAMPLE_MODEL.add(SAMPLE_MODEL.createResource("http://s"), SAMPLE_MODEL.createProperty("http://p"), lit);

models
and blob storage

As we know, RDF statements can be saved in RDF models. Simply, a blob can be saved in RDF models as a string in certain encoding (BASE64Encoding, for example). However, it is not feasible for large blobs due to large size for RDF statements and long time costs
for storing/loading.

A good idea for blob storage is to choose file systems, databases, or other stream storage services. BlobStorage interface is defined to tells where and how to save/load blobs. Several types of BlobStorages are provided in jena-blob:

  • ByteArrayBlobStorage : save blobs in byte arrays
  • FileSystemBlobStorage : save blobs in local file systems
  • KeepAsIsBlobStorage : do not save blobs, only for in-memory blob reading

BlobModelFactory provides several createXXXModel() methods to create models:

  • createMemModel() : creates a plain in-memory model, blobs can be added but not be persisted
  • createMemModel(BlobStorage blobStorage) : creates an in-memory model, blobs will be persisted in blobStorage
  • createMemModel(File blobDir) : creates an in-memory model, blobs will be persisted in local blobDir
  • createTDBModel(File dir) : creates a TDB model, blobs will be persisted in local dir/blob
  • createTDBModel(File tdbDir, BlobStorage blobStorage) : creates a TDB model, blobs will be persisted in blobStorage

the following codes illustrate blob representation in a ByteArrayBlobStorage:

    <http://s>  <http://p>  "content:R0lGODlhRgAgALP/AP///xAQEBgYGCEhITExMUpKSlpaWmtra3t7e4yMjJycnLW1tcbG
    xt7e3vf39wAAACwAAAAARgAgAEAE/xDISau9OOu923CToQBNwFXOd64aAQJj4wQGILIAIjXcPAKOwoPG4CwQiBfjASLwLIVFJZGQK
    HQVxfPSeBQXBODhIdjiKo3C61Q+TxwHd6jg8UoQtUzDkBg8pCspDmskAj8ZBjJxEgk1B0UUDYcWDgKAbzUOBFUTUg0IjUB0JwlMO4
    tABg8PBwuERgcBQwR8lxMBnBm2ckADvL/AEx5no79hvAcFJA8FAwWqZhgIQgKBPwoDzgcEphkMWAClD6WeA5BGuxqV4Aqr6RdHEpe
    qq4SD6tl5EwwJrwU6KR64wOFL34Iaey74upAgzZt85xi8IkGgCIMAExmOm/BghINuEv8cKBAC8gCqFOAmXLkwg0e7IZw+5gpGsyav
    BdFs6syAYNKGhTt/GXiXIcovUDgQmPkmYegZARlXMCCqS5ipA1UYXIlK4cg9OQ0WLNBypouMArh48DnB7UBODAk8yQg5wOeFiA8M+
    MmzQIWGBAem4UjgZEcBBQHsXkAAaMGSAwrCBKFqgeyKPi80rUKl7pjlBasKcD6hlICyDQugkvBTjNQIVzs6mkRBGcHGSI1Ox25Qxw
    5XCx8UnDMHACMK3ccnOej7ZMk5ClEGOeWQhqkEAlJ6XihcASeARxZGhx/Ag8BroxkUGNBtIM8DDNsiqSaBPGR9CrMBDFiQIMB+01G
    V8oQpWRL8sxwC3IggEXS2OLAeTrwtMIZdhO2ABCGIZbScBnP98huBQYWoUwQAOw==,length:628,digest:5ecb3255a12ef30a9
    d3c3a5554e8021d,mark:R0lGODlhRgAgALP/AP///xAQEBgYGCEhITExMUpKSlo="^^<urn:x-hp-dt:blob-bytes> .

the following codes illustrate blob representation in a FileSystemBlobStorage:

    <http://s>  <http://p>  "handle:1395714660338.bin,length:628,digest:5ecb3255a12ef30a9d3c3a5554e8021d
    ,mark:R0lGODlhRgAgALP/AP///xAQEBgYGCEhITExMUpKSlo="^^<urn:x-hp-dt.blob-file> .

query
on blobs

jena-blob adds some additional information on blob literals which enables blob query:

  • length : length of a blob, in long integer
  • digest : md5 digest string of a blob, in String (using org.apache.commons.codec.digest.DigestUtils.md5Hex(is))
  • mark : the first 32-bytes of the blob, in byte[]

for a Blob object, length()/getDigest()/getMark() methods can be used to retrieve such information.

jena-blob also provides FILTER functions to enable SPARQL query on blobs:

  • isBlob() : to determine a literal is a blob or not
  • length() : tells the length of a blob
  • digest() : tells the digest string of the blob
  • mark() : to retrieve the mark of the blob
  • mark(size) : to retrieve first size-bytes of mark
  • mark(beginning, size) : to retrieve size-bytes of mark, from the beginning of beginning

an example SPARQL query is shown as below:

    PREFIX blob: <http://bluejoe.cn/jenablob#>
    select ?s ?p ?o
    (blob:isBlob(?o) as ?v1) (blob:length(?o) as ?v2)   (blob:digest(?o) as ?v3)
    (blob:mark(?o) as ?v4) (blob:mark(?o,6) as ?v5) (blob:mark(?o,0, 6) as ?v6)
    (blob:string(?o) as ?v7) (blob:bytes(?o) as ?v8)
    where {?s ?p ?o. FILTER (blob:isBlob(?o))}

支持BLOB操作的Jena框架扩展——JenaBLOB的更多相关文章

  1. 10大支持移动“触摸操作”的JavaScript框架

    摘要:移动开发行业的发展速度让人目不暇接,也在此大势之下,推出移动网站App成为开发者必经之路,如何让触屏设备 更易使用?如何让网站对触摸手势做出反应并使触摸更友好?所有这一切,皆因JavaScrip ...

  2. Util应用程序框架公共操作类(六):验证扩展

    前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是Lambda表达式的操作类. 很多时候,我们会判断一个对象是否为null, ...

  3. 在Jena框架下基于MySQL数据库实现本体的存取操作

    在Jena框架下基于MySQL数据库实现本体的存取操作 转自:http://blog.csdn.net/jtz_mpp/article/details/6224311 最近在做一个基于本体的管理系统. ...

  4. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  5. unittest框架扩展(基于代码驱动)自动化-下

    一.数据驱动/代码驱动优缺点: 使用数据驱动的好处:- 代码复用率高.同一测试逻辑编写一次,可以被多条测试数据复用,提高了测试代码的复用率,同时可以提高测试脚本的编写效率.- 异常排查效率高.测试框架 ...

  6. 【ASP.NET Web API教程】2.1 创建支持CRUD操作的Web API

    原文 [ASP.NET Web API教程]2.1 创建支持CRUD操作的Web API 2.1 Creating a Web API that Supports CRUD Operations2.1 ...

  7. C#操作Xml树的扩展类

    本文提供一个操作Xml树的扩展类,与将xml字符串直接映射成实体对象的使用方法,供大家参考,学习. 下面附上源码 using System; using System.Collections.Gene ...

  8. UVa 11987 Almost Union-Find(支持删除操作的并查集)

    传送门 Description I hope you know the beautiful Union-Find structure. In this problem, you’re to imple ...

  9. JAVASE02-Unit03: 日期操作 、 集合框架

    Unit03: 日期操作 . 集合框架 java.util.Date package day03; import java.util.Date; /** * java.util.Date * Date ...

随机推荐

  1. C# CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具(转

    http://www.cnblogs.com/jxsoft/archive/2011/08/04/2127250.html

  2. 【转】getopt分析命令行参数

    (一) 在Linux中,用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题,例如: ./a.out -a1234 -b432 -c -d 程序会根据读取的参数执行相应的操作,在C语言中,这个 ...

  3. tomcat 7 用户设置

    在tomcat/conf/tomcat-users.xml加入如下脚本就可以了 <role rolename="admin-gui"/> <role rolena ...

  4. 转载 GUID介绍

    转载 http://www.cnblogs.com/illele/archive/2008/02/25/1080554.html GUID(Global unique identifier)全局唯一标 ...

  5. Articulate Studio课间制作工具

    Articulate Studio可以说是目前国际上用户最广泛的e-learning课件制作工具之 一,通过Articulate Studio,你可以方便.快捷的创建引人入胜的Flash演示和e-le ...

  6. Excel数据导入导出

    1.将sql数据库表中的数据导入到Excel表格里: 方法一.使用StreamWrite对象,这里要注意的是 用“\t”换列,StreamWrite对象的WriteLine方法 一行一行写入. pub ...

  7. eclipse创建maven模块工程

    创建maven模块项目,可以使用eclipse工具来完成. 1.创建父工程,注意,要选择maven-archetype-site-simple new --> maven project 填写项 ...

  8. Redis实战之征服 Redis + Jedis + Spring (二)

    不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实 ...

  9. 【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析

    作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简单介绍 1. 状态保存方法演示 ...

  10. ubuntu安装mysql后不能远程访问的方法

    ubuntu安装mysql后不能远程访问的方法1.mysql>GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassw ...