如何获得与Jena匹配Objectproperty的个人?

时间:2012-10-30 00:36:58

标签: jena ontology owl pellet

考虑以下本体,其中PERSONNAMESURNAMEIDENTIFICATION是类。 NAMESURNAMEIDENTIFICATION的子类。 hasSurnamehasName功能性ObjectProperty hasValue是具有域IDENTIFICATION和范围字符串的DataTypeProperty。

enter image description here

让我们使用两个人的jena自动实现这个模型,person1是“Henry Ford”,person2是“Harrison Ford”。

为了处理这种重复,我希望根据以下模式自动实例化本体,其中个人name1同时用于person1和person2。

String   NS    = .... // the name space
OntModel model = .... // Jena model to use   

// creating all the individuals with random uri

Individual person1  = model.createIndividual(NS + "PERSON" + Math.random());
Individual name1    = model.createIndividual(NS + "NAME" + Math.random());
Individual surname1 = model.createIndividual(NS + "SURNAME" + Math.random());
Individual person2  = model.createIndividual(NS + "PERSON" + Math.random());
Individual name2    = model.createIndividual(NS + "NAME" + Math.random());
Individual surname2 = model.createIndividual(NS + "SURNAME" + Math.random());

// asserting that ...
// person1 _hasName_ (name1 _hasValue_ "Ford")     
// person1 _hasSurname (surname1 _hasValue_ "Henry")

name1.addProperty(model.getOntProperty(NS + "hasValue"), Resourcefactory.createLiteral("Ford"));
surname1.addProperty(model.getOntProperty(NS + "hasValue"), Resourcefactory.createLiteral("Henry"));
model.add(person1, model.getOntProperty(NS + "hasName"), name1);
model.add(person1, model.getOntProperty(NS + "hasSurname"), surname1);


name1 = null; // loosing reference to name1

// asserting that ...
// person2 _hasName_ name1
// person2 _hasSurname (surname2 _hasValue_ "Harrison")

如何找到NAME类的个人,哪个属性hasvalue是“福特”才能正确完成实例化?

感谢您的回复。

1 个答案:

答案 0 :(得分:3)

从概念上讲,为什么surname1surname2必须是不同的个体?使用Math.random()看起来很奇怪。如果你考虑一下你所陈述的问题,你就有两个人,亨利福特和哈里森福特,在你的领域模型中,你希望名字和姓氏是独立的个体(我认为你有充分的理由,这是一个奇怪的方式接近这个特殊问题)。所以我对你的建模方法的问题是:是否有一个姓氏福特由两个人共享,或者有两个姓氏恰好具有相同的hasValue字面值?

就个人而言,我会通过利用图中的通用结构来解决这个问题:

ns:ford 
  a ns:Surname ;
  ns:hasValue "Ford".

ns:harrison
  a ns:FirstName ;
  ns:hasValue "Harrison".

ns:henry
  a ns:FirstName ;
  ns:hasValue "Henry".

ns:person1
  a ns:Person ;
  ns:firstName ns:henry ;
  ns:surname ns:ford .

ns:person2
  a ns:Person ;
  ns:firstName ns:harrison ;
  ns:surname ns:ford .

但是,我不知道你要解决的问题是什么,所以我无法确定这是否适合你。例如,它可以很容易地找到所有姓氏相同的人。

一般来说,如果想要在图表中共享节点,那么您确实希望福特的两种不同用途是不同的,您可以使用空白节点来节省乱码随机数:

ns:person1
  a ns:Person ;
  [a ns:SurName ; ns:hasValue "Ford"] ;
  [a ns:FirstName ; ns:hasValue "Henry"].

所以我的主要答案是要清楚你想要建立的图表。然后,耶拿称你需要做的事情会更清楚。

要回答您的具体问题,如果您想根据其属性模式找到特定资源,我建议您使用SPARQL查询。您可以使用Jena API调用模式执行此操作,但是一旦超过初始大小的模式,SPARQL查询就会更加紧凑。