Cách lấy giá trị của một Property (thuộc tính) nhất định trong Individual

Bài toán đặt ra một mục tiêu là tìm ra các thuộc tính cho một đối tượng (cụ thể ở đây là các Individuals trong ontology).

Tạo 1 Instance của OWLReasoner và cho nhận các lệnh sau(*):

OWLReasoner.getDataPropertyValues(OWLNamedIndividual ind, OWLDataProperty pe) to get data property value (tức là lấy trực tiếp giá trị của property của Individual này). Vd nếu một Individual có thuộc tính hasEmail với giá trị là abcxyz@gmail.com chẳng hạn, thì kết quả sẽ trả về là  abcxyz@gmail.com

OWLReasoner.getObjectPropertyValues(OWLNamedIndividual ind, OWLObjectPropertyExpression pe) to get object property of an individual (cái này là lấy về đối tượng (giá trị) của property đó). Vd thuộc tính isBelongedTo có giá trị là XXXCompany thì kết quả trả về là XXXCompany.

***

Để có thể visit hết các loại thuộc tính (SomeValueFrom, AllValueFrom, HasValue) thì thêm các hàm visit sau:

public void visit(OWLObjectSomeValuesFrom desc) {
restrictedProperties.add(desc.getProperty());
}

public void visit(OWLObjectAllValuesFrom desc) {
restrictedProperties.add(desc.getProperty());
}

public void visit(OWLObjectHasValue desc) {
restrictedProperties.add(desc.getProperty());
}

vào class này:

private static class RestrictionVisitor extends OWLClassExpressionVisitorAdapter {

private boolean processInherited = true;
private Set<OWLClass> processedClasses;
private Set<OWLObjectPropertyExpression> restrictedProperties;
private Set<OWLOntology> onts;

public RestrictionVisitor(Set<OWLOntology> onts) {
restrictedProperties = new HashSet<OWLObjectPropertyExpression>();
processedClasses = new HashSet<OWLClass>();
this.onts = onts;
}

public void setProcessInherited(boolean processInherited) {
this.processInherited = processInherited;
}

public Set<OWLObjectPropertyExpression> getRestrictedProperties() {
return restrictedProperties;
}

public void visit(OWLClass desc) {
if (processInherited && !processedClasses.contains(desc)) {
// If we are processing inherited restrictions then
// we recursively visit named supers. Note that we
// need to keep track of the classes that we have processed
// so that we don't get caught out by cycles in the taxonomy
processedClasses.add(desc);
for (OWLOntology ont : onts) {
for (OWLSubClassOfAxiom ax : ont.getSubClassAxiomsForSubClass(desc)) {
ax.getSuperClass().accept(this);
}
}
}
}

public void reset() {
processedClasses.clear();
restrictedProperties.clear();
}

}

Sau đó gọi các lệnh tương ứng để lấy hết các thuộc tính của nó. Vd 1 lệnh:

for (OWLObjectPropertyExpression prop : restrictionVisitor.getRestrictedProperties()) {
 System.out.println(" " + prop);
 }

(*)Muốn dùng lệnh này phải đổi sang OWL APIv3, còn phiên bản 2.2.0 thì ko có.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s