资源描述框架(RDF)最近成为W3C的推荐,与XML和SOAP等其他Web标准一起被取代。 RDF可以应用于处理临时传入数据的领域(例如CRM),并且已经广泛用于社交网络和LiveJournal和TypePad等自发布软件。
Java程序员将具有使用RDF模型的技能,从而逐渐受益。 在本文中,我将带您了解HP Labs的开源Jena Semantic Web Framework的一些功能(请参阅参考资料 )。 您将学习如何创建和填充RDF模型,如何将其持久化到数据库中以及如何使用RDQL查询语言以编程方式查询它们。 最后,我将演示如何使用Jena的推理功能从本体论中推断有关模型的知识。
本文假定您对RDF有所了解-包括图形,三元组和模式之类的概念-以及Java编程的基本知识。
创建一个简单的RDF模型
让我们从基础开始:从头开始创建模型并向其中添加RDF语句。 在本节中,我将展示如何创建一个模型来描述一组虚构的家庭成员之间的关系,如图1所示:
图1.虚构的家谱
![小家谱](https://i-blog.csdnimg.cn/blog_migrate/aff4edddd3ff15302f5ee68966094605.png)
你会描述使用性质不同的关系类型siblingOf
, spouseOf
, parentOf
和childOf
,从“关系”词汇拍摄(见相关主题 )。 为简单起见,使用来自虚构名称空间http://family/
URI标识家庭成员。 词汇URI在Jena代码中经常使用,因此将它们声明为Java常量很有用,从而减少了混淆它们的风险。
耶拿的ModelFactory
类是创建不同类型模型的首选方法。 在这种情况下,您需要一个空的内存模型,因此ModelFactory.createDefaultModel()
是要调用的方法。 此方法返回Model
的实例,您将使用该实例创建代表家庭中每个人的Resource
。 创建资源后,可以对它们进行声明并添加模型。
在耶拿(Jena)中,语句的主题始终是Resource
,谓词由Property
表示,而对象是另一个Resource
或文字值。 文字在耶拿用Literal
类型表示。 所有这些类型共享一个公共接口RDFNode
。 您将需要四个不同的Property
实例来表示家族树中的关系。 这些实例是使用Model.createProperty()
创建的。
向模型添加语句的最简单方法是调用Resource.addProperty()
。 此方法在模型中创建一个以“ Resource
为主题的语句。 该方法有两个参数,一个表示语句谓词的Property
和该语句的对象。 addProperty()
方法已重载:一个重载将RDFNode
作为对象,因此可以使用Resource
或Literal
。 还有一些方便重载,它们采用Java原语或String
表示的文字。 在该示例中,语句的对象是Resource
代表其他家庭成员。
通过调用带有三元组的主题,谓词和对象的Model.createStatement()
,也可以在模型上直接创建语句。 请注意,以这种方式创建一个Statement
不会将其添加到模型中。 如果要将其添加到模型中,请使用创建的Statement
调用Model.add()
,如清单1所示:
清单1.创建一个代表虚构家庭的模型
// URI declarations
String familyUri = "http://family/";
String relationshipUri = "http://purl.org/vocab/relationship/";
// Create an empty Model
Model model = ModelFactory.createDefaultModel();
// Create a Resource for each family member, identified by their URI
Resource adam = model.createResource(familyUri+"adam");
Resource beth = model.createResource(familyUri+"beth");
Resource chuck = model.createResource(familyUri+"chuck");
Resource dotty = model.createResource(familyUri+"dotty");
// and so on for other family members
// Create properties for the different types of relationship to represent
Property childOf = model.createProperty(relationshipUri,"childOf");
Property parentOf = model.createProperty(relationshipUri,"parentOf");
Property siblingOf = model.createProperty(relationshipUri,"siblingOf");
Property spouseOf = model.createProperty(relationshipUri,"spouseOf");
// Add properties to adam describing relationships to other family members
adam.addProperty(siblingOf,beth);
adam.addProperty(spouseOf,dotty);
adam.addProperty(parentOf,edward);
// Can also create statements directly . . .
Statement statement = model.createStatement(adam,parentOf,fran);
// but remember to add the created statement to the model
model.add(statement);
完整的代码示例FamilyModel.java还演示了如何将批处理语句立即作为数组或java.util.List
添加到模型java.util.List
。
建立家庭模型后,让我们看看如何使用Jena的查询API从信息中提取信息。
询问RDF模型
以编程方式询问Jena模型主要是通过Model
和Resource
接口上的list()
方法执行的。 这些方法可用于获取与某些条件匹配的主题,对象和Statement
。 它们还返回java.util.Iterator
,它具有返回特定对象类型的额外方法。
让我们回到清单1的家庭模型示例,看看可以如何查询它,如清单2所示:
清单2.查询族模型
// List everyone in the model who has a child:
ResIterator parents = model.listSubjectsWithProperty(parentOf);
// Because subjects of statements are Resources, the m