我正在开发一个使用GWT开发的Web应用程序。我也在使用OWL本体和Jena框架来构建应用程序中的语义内容。
应用程序中的一个简单功能是从用户获取一些数据并将其发送到服务器端,以使用本体存储为数据图。我想一种方法是将数据存储为等同于本体类的java类对象,并使用GWT异步通信发送它们。要将OWL类转换为java,我使用了Jastor。
我的问题是,在服务器收到java类后,是否可以使用Jena和/或Jastor的功能轻松转换为OWL个体并将其添加到数据图中?例如,在服务器端接口实现中,我们称之为:
Public void StoreUser (User userObj) {
//User: a Jastor created java class. userObj is instantiated using the user data on the client side.
OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
//Open the ontology here using inputstream and ontModel.read!
Individual indiv = (Individual) userObj.resource();
//Add the individual to the model here! }
不幸的是,我无法找到任何可以将现有个体添加到模型中的Jena函数。
您是否建议使用另一种方法将本体数据传递到服务器端并存储它,而不是使用Jastor创建的类(例如使用XML文件)?
感谢您的帮助
答案 0 :(得分:2)
答案分为两部分。首先,Individual
是Jena Resource
的子类,这绝对是您可以添加到模型中的东西。但是,单个资源或属性或文字不存储在Model
中。 Model
仅存储三元组,在Java API中表示为Statement
个对象。因此,要向模型添加一些资源,您必须将其包含在三元组中。
在Jena中,个体被定义为三元组的主语,其谓词为rdf:type
,其对象不是内置语言类之一。所以如果你有:
ex:my_car rdf:type ex:Ferrari .
ex:Ferrari rdf:type owl:Class .
(注意:此示例完全是虚构的!),然后ex:my_car
将是个人,但ex:Ferrari
不会(因为OWL Class
是内置类型)。因此,要将您的个人添加到模型中,您只需断言它属于某种类型。由于我不知道GWT并且不使用Jastor,我不能说序列化后是否保留了通常属于Jena Individual
的类型关联。我怀疑不是,在这种情况下,您需要使用其他方法来确定要添加的个人的类型,或者使用与rdf:type
不同的谓词将资源添加到Model
}。
所有这一切,我个人可能根本不会以这种方式解决你的问题。通常,当我使用服务器端RDF的客户端表示时,我只将最小信息(例如URI和标签)作为JSON发送到客户端。如果我需要关于给定资源的更多数据,我可以将它与初始JSON序列化一起发送,或者它只是一个Ajax调用。但是,正如我所说,我不使用GWT,因此建议可能对您没有任何用处。