考虑以下本体,其中PERSON
,NAME
,SURNAME
和IDENTIFICATION
是类。 NAME
和SURNAME
是IDENTIFICATION
的子类。 hasSurname
和hasName
是功能性ObjectProperty 。 hasValue
是具有域IDENTIFICATION
和范围字符串的DataTypeProperty。
让我们使用两个人的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
是“福特”才能正确完成实例化?
感谢您的回复。
答案 0 :(得分:3)
从概念上讲,为什么surname1
和surname2
必须是不同的个体?使用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查询就会更加紧凑。