在Aperture中使用RDF2Go
Aperture是基于RDF2Go建立的,它是一个抽象层,允许Aperture易于与流行的RDF存储引擎如Sesame, Jena工作。支持的RDF存储引擎的完整列表和详细文档请参阅RDF2Go主页http://rdf2go.semweb4j.org/
本指南不打算作为RDF2go的详细文档,只是是开发者意识到一定的RDF2go问题对于使用Aperture是重要的。本章需要一些Aperture知识,所以如果你是新手,请先熟悉本教程的其余部分。
RDF2Go 基础
在RDF2Go中Model是最重要的接口, 它封装了RDF存储引擎的选择及提供与之交互的方法。由于RDF2Go仅仅是一个抽象层,每一个用户需要一个具体的Model实现与之工作,有少数Model实现(见这里)。对于每一个支持的RDF存储引擎有一个适配器,一个jar文件包含了Model的实现及其他所有的必要的接口。你需要有rdf2go.api的jar,适配器的 jar和你选择的RDF存储引擎实现的jar。(至少三个)。aperture发布版在必须的lib文件夹中自带了rdf2go.api,连同可选的lib文件夹中的sesame-runtime-osgi.jar和rdf2go.impl.sesame23.jars,你可以通过简单的在你的classpath中替换成合适的jar用不同的RDF存储引擎替换后面两者
初始化Model
有许多方式初始化Model,普通的开发者应该至少意识到三种,第一种是最简单的(例子中使用是来自于sesame2实现的类,它应该对于所有其他存储引擎是足够相似的)
Model model = new RepositoryModel(false) model.open();
上面是使用的RepositoryModel类的一个构造函数,这将创建一个简单的、非推理的在内存中的仓库。对于许多情况已经足够了。如果你需要更多的灵活性,并且愿意学习你的实现的复杂性(或者已经从内心熟悉他们)你可以创建一个你自己的repository实例,并传给RepositoryModel的构造函数。Sesame文档包含了一个详细的页面,通过各种方式创建Repository接口的实例。基于文件的RDF持久化repository的例子如下所示
// you can initialize the repository the way you want, add any elements // to the sail stack, use hard disk or data base persistence ... // the full power of sesame lies at your fingertips Repository repository = new RepositoryImpl( new RDFSRules( new NativeStore( new File("path/to/the/store/folder")))); Model model = new RepositoryModel(repository); model.open();
如果你需要你的代码与任何具体的rdf2go实现相分离,第三部分派上用场了,但是仍想创建Model。(例如Aperture)RDF2go提供了一个称为RDF2Go的单例,该类能够在运行时检测安装的RDF2Go适配器实现。它类似于在SLF4J日志框架这发现的模式,对于RDF2Go检测它们,只要适配器的jar在classpath中就足够了。你可以显式的调用RDF2Go.register()方法和RDF2Go.unregister()方法重写此行为。有了它,创建模型更简单。
Model model = RDF2Go.getModelFactory().createModel(); model.open();
也也可以设置一些属性来影响创建的模型的类型 ".createModel( Properties props );"
打开与关闭
打开与关闭模型
RDF2Go 模型工作往往需要一定的资源,可能包括打开的文件,数据库连接,http连接或者任何其他的所需的底层的实现。因此使用模型和当它们不再需要时返回它们前有必要显式的获取这些资源。这是拥有一个统一的API来访问一个简单的5个三元组和数以百万计的海量数据库的内存模型的代价。。
如此的模型工作遵循以下模式;
Model model = prepareTheModelAndTheUnderlyingImplementation(); model.open(); // 'open' the model and aquire all necessary system resources doYourWork(model); model.close(); // return the resources...
或者,更通用:
Model model = null; try { model = prepareTheModelAndTheUnderlyingImplementation(); model.open(); // 'open' the model and aquire all necessary system resources doYourWork(model); } catch (Exception e) { doSomethingWithTheException(e); } finally { if (model != null) model.close(); // return the resources... }
必须记住它,如果你试图使用一个未打开的模型你可以能得到错误,如果不适当关闭则会警告。这一特征很重要,因为它意味着在Aperture中的其他的设计决策。
打开和关闭RDFContainer
RDFContainer封装了模型,因此为了与container工作,模型必须是打开的,记住当你传输模型到RDFContainer构造函数,模型是自动打开的,至少在默认的实现里面。当你用RDFContainer停止运行,你需要释放它。我们不鼓励你通过调用container.getModel().close()手动关闭底层的模型。在很多情况下,当多个RDFContainer共享相同的模型,它们代表存储在同一模型中的各种资源的属性,如果你一个container停止运行并且要关闭关闭底层的模型-所有其他的container将会变为无效,可能导致细微的bug
我们介绍了一种方法来避免这种情况。RDFContainerImpl的构造函数可能接受第三个布尔参数。将其设置为true,并且底层模型将被视为共享和处理RDFContainer将不会关闭底层模型。设计应用程序时,请记住这一点。
详细在source code of the dispose() method 在RDFContainerImpl类。
打开和关闭DataObject
DataObject封装了(间接)两个RDFContainers。实际的元数据container和数据源的配置。第一个是通过dataObject.getMetadata()可用,和第二个通过dataObject.getDataSource().getConfiguration()可用。
当你释放data object,元数据container跟着释放。(我要强调的是RDFContainer被释放,不是强调元数据模型被关闭)数据源的配置并没有。没有DataSource.dispose()方法,所以当你创建一个数据源实例你需要记得关注配置RDFCOntainer,当你不再需要它时。
详细在 source code of the DataObjectBase class, the dispose() method---------------------------------------------------------------------------
本系列WEB数据挖掘系本人原创
作者 博客园 刺猬的温驯
本文链接 http://www.cnblogs.com/chenying99/archive/2013/06/14/3135296.html
本文版权归作者所有,未经作者同意,严禁转载及用作商业传播,否则将追究法律责任。