2015-09-13 5 views
0

У меня есть онтология, созданная с использованием Protegé 4.3.0, и я бы использовал OWL-API, чтобы получить значения свойств объекта (т. Е. Набор объектов OWLNamedIndividual) для указанного индивидуального выражения свойства объекта и объекта.Как получить значения свойств объекта для указанного человека?

Set<OWLNamedIndividual> values = reasoner.getObjectPropertyValues(individual, hasPart).getFlattened(); 

К сожалению, выше инструкции не возвращают элементов, так как в моей онтологии связь между людьми осуществляется через несколько подразделов свойств объекта hasPart свойства объекта.

ОБНОВЛЕНИЕ: В последние несколько часов я нашел следующее решение, чтобы получить свойства подлога, связанные с указанным OWLNamedIndividual.

private Set<OWLObjectProperty> getRelatedSubObjectProperties(OWLNamedIndividual individual) { 
    HashSet<OWLObjectProperty> relatedObjectProperties = new HashSet<>(); 

    HashSet<OWLObjectPropertyExpression> subProperties = new HashSet<>(); 
    subProperties.addAll(hasPart.getSubProperties(ontology)); 

    Set<OWLClass> types = reasoner.getTypes(individual, true).getFlattened(); 

    for (OWLObjectPropertyExpression property : subProperties) { 
     Set<OWLClassExpression> domains = property.getDomains(ontology); 
     for (OWLClassExpression domain : domains) { 
      if (types.contains(domain.asOWLClass())) { 
       relatedObjectProperties.add(property.asOWLObjectProperty()); 
      } 
     } 
    } 

    return relatedObjectProperties; 
} 

Тогда я хотел бы получить значение свойств объекта следующим образом:

for (OWLObjectProperty property : getRelatedSubObjectProperties(individual)) { 
    Set<OWLNamedIndividual> values = reasoner.getObjectPropertyValues(individual, property).getFlattened(); 
    if (values != null) { 
     for (OWLNamedIndividual value : values) { 
      // a value associated to the individual 
     } 
    } 
} 

Как я могу решить эту проблему?

+1

Простите, может быть, это очень очевидно, но только для моей информации, почему вы называете метод 'getObjectPropertyValues ​​()' аргументом, а не конкретным 'OWLNamedIndividual'? –

+1

Вызов метода для отдельного человека не использует аргументатора для ответа, поэтому его результаты могут быть неполными. – Ignazio

+0

@KunalKhaladkar: ваше решение на самом деле выглядит лучше: вызов метода 'getObjectPropertyValues ​​()' для конкретного 'OWLNamedIndividual' возвращает' Map > ', поэтому я должен проверить, какие ключи являются атрибутом sub object' hasPart '... – enzom83

ответ

1

В документации для getObjectPropertyValues() явно не указано, что будут учитываться под-свойства, поэтому поведение здесь может быть зависимым от пользователя. Какой разумник вы используете?

Обходной способ заключается в том, чтобы получить все подзадачи свойства, которое вы используете, и пройти через все из них, чтобы получить все результаты.

+0

Я обновил свой вопрос, добавив решение, которое я реализовал, чтобы найти все свойства вспомогательных объектов, связанные с указанным объектом' OWLNamedIndividual'. – enzom83

+0

Я использую структурный аргумент, но я знаю, что он не делает выводов, но использует утверждённые аксиомы в онтологии. Однако я думал, что лучшим решением может быть предложение, предложенное _KunalKhaladkar_, т.е. вызывая 'getObjectPropertyValues ​​()' в конкретном 'OWLNamedIndividual': этот метод возвращает' Map > ', поэтому я должен проверить, какие ключи являются атрибутом sub-объекта' hasPart' ... – enzom83

+1

Использование структурный аргумент определенно не вернет использование под-свойств. Если вы ограничиваете себя этим аргументом, решение @KunalKhaladkar эквивалентно. – Ignazio