1

让我们考虑以下本体,其中、 和PERSONNAME类。并且是 的子类。并且是功能 ObjectProperty。是具有域和范围字符串的 DataTypeProperty。SURNAMEIDENTIFICATIONNAMESURNAMEIDENTIFICATIONhasSurnamehasNamehasValueIDENTIFICATION

在此处输入图像描述

让我们使用 jena 和 2 人自动实例化这个模型,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为“福特”的类的个体以正确完成实例化?

感谢您的回复。

4

1 回答 1

3

surname1从概念上讲,为什么surname2必须是不同的个体?那里的使用Math.random()看起来很奇怪。如果您考虑您陈述的问题,您有两个人,Henry Ford 和 Harrison Ford,并且在您的域模型中,您希望姓名和姓氏是独立的个体(我假设您有充分的理由,这是一种奇怪的方式接近这个特定的问题)。所以我对你的建模方法的问题是:两个人是否共享一个姓氏福特,或者是否有两个姓氏恰好有相同的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 .

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

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

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

因此,我对您问题的主要回答是要清楚您要构建的图表。然后你需要做的耶拿会更清楚。

要回答您的具体问题,如果您想根据其属性模式定位特定资源,我建议使用 SPARQL 查询。您可以使用 Jena API 调用的模式来做到这一点,但 SPARQL 查询一旦超过了很小的初始模式大小,就会变得更加紧凑。

于 2012-10-31T13:10:53.290 回答