• Non ci sono risultati.

C. Componenti software

C.3. Utilizzo delle proprietà di navigazione

Nel paragrafo 2.5 è stato presentato il modello di navigazione dei contenuti basato sulla semantica di dominio. Lo strumento utilizzato per formalizzare la correlazione tra quest’ultima e le triple nel dataset in base al modello concettuale derivato dalle due ontologie di riferimento, sono le cosiddette ‘proprietà di navigazione’ (‘navProp’). Queste vengono definite come OWL Object Properties all’interno dell’ontologia di dominio Corago SM. Attraverso la condivisione dell’ancestor comune (la proprietà astratta corago:CPA2_navigable) queste costituiscono il layer che l’applicazione di consultazione impiega per rappresentare le risorse nelle viste utente. La relazione tra proprietà e la corrispondente porzione di grafo è specificata come property path della proprietà di navigazione. Per produrre una rappresentazione della risorsa in base alle ‘navProps’, l’applicazione di consultazione dovrà semplicemente individuare quelle riferite al tipo della risorsa in oggetto e tradurre la property path di ciascuna in una interrogazione SPARQL per estrarre i contenuti corrispondenti.

189 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;

public class NavPropertyBean implements Comparable<NavPropertyBean> { private String propIri, propChain;

private int priority, typingClassPosition;

private Map<String,String> propLabels, propComments; private String typingClass,thematicArea;

private List<String> domainClasses, rangeClasses; private boolean isFeature=false;

public NavPropertyBean() {

propLabels = new HashMap<String,String>(); propComments = new HashMap<String,String>(); }

public String getPropIri() { return propIri; }

public void setPropIri(String propIri) { this.propIri = propIri; }

public Map<String, String> getPropLabels() { return propLabels;

}

public void setPropLabels(Map<String, String> propLabels) { this.propLabels = propLabels;

}

public Map<String, String> getPropComments() { return propComments;

}

public void setPropComments(Map<String, String> propComments) { this.propComments = propComments;

} @Override

public String toString() { return propIri; }

public String getPropChain() { return propChain; }

public void setPropChain(String propChain) { this.propChain = propChain; }

public void addLabel(String label, String lang) {

propLabels.put(lang, label); }

public void addComment(String comment, String lang) {

propComments.put(lang, comment); }

[…]

190

[…]

public String getLabel(String lang) {

return propLabels.get(lang); }

public String getComment(String lang) {

return propComments.get(lang); }

public int getPriority() { return priority; }

public void setPriority(int priority) { this.priority = priority; }

@Override

public int compareTo(NavPropertyBean o) { if (this.getPriority()<o.getPriority()){

return -1; }else{

return 1; } }

public int getTypingClassPosition() { return typingClassPosition; }

public void setTypingClassPosition(int typingClassPosition) { this.typingClassPosition = typingClassPosition; }

public String getTypingClass() { return typingClass; }

public void setTypingClass(String typingClass) { this.typingClass = typingClass; }

public String getThematicArea() { return thematicArea; }

public void setThematicArea(String thematicArea) { this.thematicArea = thematicArea; }

public List<String> getDomainClasses() { return domainClasses; }

public void setDomainClasses(List<String> domainClasses) { this.domainClasses = domainClasses;

}

public List<String> getRangeClasses() { return rangeClasses; }

public void setRangeClasses(List<String> rangeClasses) { this.rangeClasses = rangeClasses;

}

public boolean isFeature() { return isFeature; }

public void setIsFeature(boolean isFeature) { this.isFeature = isFeature; }

}

191

Le ‘navProp’ sono implementate nell’applicazione sperimentale attraverso una classe specifica “NavPropertyBean” di cui viene creata una istanza in fase di inizializzazione per ciascuna proprietà di navigazione prevista dal Corago SM. Il listato C.3.1 (parti a e b) riporta il codice relativo alla definizione della classe. Si noti la proprietà PropChain con i relativi metodi getter e setter utilizzata per conservare la stringa relativa alla property path corrispondente alla specifica istanza di ‘navProp’. L’inizializzazione della collezione di proprietà di navigazione in forma di Java beans avviene in fase di avvio dell’applicazione ad opera del metodo: populateNavigablePC(OWLOntology corago) della classe ConfigurationBean adibita alla raccolta delle configurazioni di sistema.

Il listato C.3.2 (parti a e b) illustra invece la funzione che, in fase di inizializzazione, provvede a leggere l’ontologia Corago SM e ad istanziare le proprietà di navigazione previste per ciascuna tipologia di risorsa.

192 public void populateNavigablePC(OWLOntology corago) {

// gestisce la valorizzazione della configurazione delle proprietà di navigazione

OWLObjectProperty objPropAncestor = corago.getOWLOntologyManager().getOWLDataFactory() .getOWLObjectProperty(IRI.create(this.getNavigableRelationAncestor())); OWLDataProperty dataPropAncestor = corago.getOWLOntologyManager().getOWLDataFactory()

.getOWLDataProperty(IRI.create("http://corago.unibo.it/sm/CDA2_navigable"));

Set<OWLSubObjectPropertyOfAxiom> objProps = corago.getObjectSubPropertyAxiomsForSuperProperty(objPropAncestor); Set<OWLSubDataPropertyOfAxiom> dataProps = corago.getDataSubPropertyAxiomsForSuperProperty(dataPropAncestor); Set<OWLSubPropertyChainOfAxiom> propChains = corago.getAxioms(AxiomType.SUB_PROPERTY_CHAIN_OF);

// itero sulle navigation object properties dell'ontologia

for (OWLSubObjectPropertyOfAxiom aSub : objProps) { String sprqlClause = "";

String pcLabel = "";

int priority = 0, typingClassPosition = 0;

ArrayList<String> pcForProperty = new ArrayList<String>(); Iterator<OWLSubPropertyChainOfAxiom> ai = propChains.iterator(); // itero sulle proprietà navigabili

while (ai.hasNext()) {

OWLSubPropertyChainOfAxiom aPC = ai.next();

// se trovata come super proprietà allora estraggo la property chain e costruisco l'equivalente SPARQL

if (aSub.getSubProperty().toString().equals(aPC.getSuperProperty().asOWLObjectProperty().toString())) { String pcClause = "";

Iterator<OWLObjectPropertyExpression> pcI = aPC.getPropertyChain().iterator(); while (pcI.hasNext()) {

OWLObjectPropertyExpression pcE = pcI.next(); if (pcClause.length() > 0)

pcClause += "/"; if (!pcE.isAnonymous())

pcClause += Misc.removePrefix(pcE.asOWLObjectProperty().getIRI().toString(), this); else

pcClause += Misc.removePrefix(

"^" + pcE.getSimplified().getNamedProperty().getIRI().toString(), this);} pcForProperty.add(pcClause);}

}

// concateno la stringa SPARQL sommando in OR ciascuna property chain

Iterator<String> pcIt = pcForProperty.iterator(); while(pcIt.hasNext()) {

String clToAdd= pcIt.next(); sprqlClause += clToAdd; if(pcIt.hasNext())

sprqlClause += "|";}

// valorizzo le proprietà in base alla definizione della property

pcLabel = Misc.getAnnotationValue(aSub.getSubProperty().asOWLObjectProperty(),

"http://www.w3.org/2000/01/rdf-schema#label", this.getPreferredLanguage(), corago); String pri = Misc.getAnnotationValue(aSub.getSubProperty().asOWLObjectProperty().getIRI(),

"http://corago.unibo.it/sm/CPAN1_priority", this.getPreferredLanguage(), corago); String isFeat = Misc.getAnnotationValue(aSub.getSubProperty().asOWLObjectProperty().getIRI(),

"http://corago.unibo.it/sm/CPAN5_is_feature", this.getPreferredLanguage(), corago); String typingClass = Misc.getAnnotationValue(aSub.getSubProperty().asOWLObjectProperty().getIRI(),

"http://corago.unibo.it/sm/CPAN2_typing_class", this.getPreferredLanguage(), corago); String typingClassPos = Misc.getAnnotationValue(aSub.getSubProperty().asOWLObjectProperty().getIRI(),

"http://corago.unibo.it/sm/CPAN3_typing_class_position", this.getPreferredLanguage(), corago); String thematicArea = Misc.getAnnotationValue(aSub.getSubProperty().asOWLObjectProperty().getIRI(),

"http://corago.unibo.it/sm/CPAN4_thematic_area", this.getPreferredLanguage(), corago);

[…]

193

[…]

// valorizzo domain e range della property

Set<OWLObjectPropertyDomainAxiom> domains = corago.getObjectPropertyDomainAxioms(aSub.getSubProperty()); Set<OWLObjectPropertyRangeAxiom> ranges = corago.getObjectPropertyRangeAxioms(aSub.getSubProperty()); Set<OWLSubObjectPropertyOfAxiom> subs = corago

.getObjectSubPropertyAxiomsForSubProperty(aSub.getSubProperty()); if (pri != "n.d.")

priority = Integer.parseInt(Misc.stripValue(pri)); if (typingClassPos != "n.d.")

typingClassPosition = Integer.parseInt(typingClassPos); NavPropertyBean aNb = new NavPropertyBean();

if (domains != null && !domains.isEmpty()) {

Iterator<OWLObjectPropertyDomainAxiom> aid = domains.iterator(); ArrayList<String> domainClasses = new ArrayList<>();

while (aid.hasNext()) {

domainClasses.add(aid.next().getDomain().toString()); }

aNb.setDomainClasses(domainClasses);} if (ranges != null && !ranges.isEmpty()) {

Iterator<OWLObjectPropertyRangeAxiom> air = ranges.iterator(); ArrayList<String> rangeClasses = new ArrayList<>();

while (air.hasNext()) { rangeClasses.add(air.next().getRange().toString()); } aNb.setRangeClasses(rangeClasses);} aNb.setPropChain(sprqlClause); aNb.setPropIri(aSub.getSubProperty().asOWLObjectProperty().getIRI().toString()); aNb.addLabel(pcLabel, "it"); aNb.setPriority(priority); aNb.setTypingClass(typingClass); aNb.setTypingClassPosition(typingClassPosition); aNb.setThematicArea(thematicArea);

if (isFeat != null && isFeat.equals("true")) aNb.setIsFeature(true);

// estraggo il dominio

OWLObjectProperty oP = aSub.getSubProperty().asOWLObjectProperty();

Set<OWLObjectPropertyDomainAxiom> propDom = corago.getAxioms(AxiomType.OBJECT_PROPERTY_DOMAIN); Iterator<OWLObjectPropertyDomainAxiom> apDI = propDom.iterator();

while (apDI.hasNext()) {

OWLObjectPropertyDomainAxiom apD = apDI.next();

// aggancio solo se il dominio è ammesso e per tutte le eventuali sottoclassi

if (apD.getProperty().toString().equals(oP.toString())) {

this.addCoragoNavigationCRProp(apD.getDomain().toString(), aNb);

//valuto le sottoclassi del dominio

List<OWLSubClassOfAxiom> subPropDomains = new ArrayList<OWLSubClassOfAxiom>(); for (final OWLSubClassOfAxiom subClasse : corago.getAxioms(AxiomType.SUBCLASS_OF)) {

if (subClasse.getSuperClass()==apD.getDomain()) { subPropDomains.add(subClasse);

System.out.println(subClasse.getSubClass() + " extends " + subClasse.getSuperClass()); } } for(OWLSubClassOfAxiom aSubDom:subPropDomains) { this.addCoragoNavigationCRProp(aSubDom.getSubClass().toString(), aNb); } }}} } Listato C.3.2b

Documenti correlati