1.6 Web services ed annotazione semantica
1.6.1 SAWDSL (Semantic Annotation for WSDL)
SAWSDL (Semantic Annotation for WSDL) [Wor07b] definisce alcuni attri- buti di estensione che possono essere utilizzati per annotare i documen- ti WSDL o gli XML Schema, facendo riferimento ad opportuni modelli semantici.
In particolare questa tecnologia fornisce dei meccanismi standard attraverso i quali i concetti dei modelli semantici, che sono tipicamente definiti all’e- sterno di documenti WSDL o XML Schema, possono essere riferiti da questi ultimi attraverso il ricorso ad alcune annotazioni [LF07].
Il namespace di SAWSDL [Wor07a] consente di aggiungere come attributi ad un qualsiasi elemento presente all’interno di un documento WSDL o di un XML Schema le tre annotazioni seguenti:
• modelReference; consente di specificare una associazione tra un com- ponente di un documento WSDL o XML Schema ed un concetto pre- sente in un modello semantico. In particolare, pu`o essere utilizzato per annotare definizioni di tipi, elementi o attributi in un XML Schema, cos`ı come per la dichiarazione di interfacce, operazioni ed errori in un documento WSDL.
14Un endpoint SPARQL `e un servizio che accetta query in tale linguaggio e ne restituisce
1.6 Web services ed annotazione semantica 17
L’attributo modelReference pu`o assumere come valore uno o pi`u URI15 (separati da spazi), ognuno dei quali identifica un determinato concet- to presente nel modello semantico in oggetto 16; in tal modo ogni URI consente di fornire informazioni semantiche riguardo al partico- lare componente annotato all’interno del documento WSDL o XML Schema.
• loweringSchemaMapping; pu`o essere aggiunto a dichiarazioni di ele- menti o definizioni di tipi in un XML Schema.
Tale attributo pu`o assumere come valore uno o pi`u URI verso opportu- ne definizioni di regole di mappatura le quali possono essere applicate nella fase in cui una selezione di dati presenti in un modello seman- tico viene trasformata (to lower, abbassare) in un documento XML. In generale, ma non necessariamente, i dati forniti in input a tale tra- sformazione sono stati selezionati grazie all’uso di una query SPARQL applicata sul modello semantico, mentre le regole di mappatura sono espresse come trasformazione XSLT17.
• liftingSchemaMapping; pu`o essere aggiunto a dichiarazioni di elementi o definizioni di tipi in un XML Schema.
Tale attributo pu`o assumere come valore uno o pi`u URI verso opportu- ne definizioni di regole di mappatura le quali possono essere applicate nella fase in cui un documento XML (ovviamente conforme all’XML Schema considerato) viene trasformato (to lift, sollevare) in un mo- dello semantico. In generale, ma non necessariamente, le regole di mappatura sono espresse come trasformazione XSLT.
Al fine di chiarire i concetti sin qui illustrati, viene presentato un esempio tratto dal sito del World Wide Web Consortium, in particolare dalla pagina relativa a SAWSDL [LF07] riguardante un sistema per la gestione di ordini; nei due listati 1.2 e 1.3 sono rappresentati rispettivamente un XML Schema ed una ontologia OWL relativi al problema citato.
`
E possibile osservare che all’interno di tale XML Schema sono presenti due elementi, in particolare OrderRequest e OrderResponse i quali contengono entrambi al loro interno un attributo modelReference il cui URI consente di fare riferimento ad un particolare concetto semantico presente nell’ontologia OWL citata.
15Se un componente `e annotato con un attributo modelReference che include pi`u di
un URI, si ipotizza che ognuno di essi faccia riferimento a tale componente; tuttavia non viene definita alcuna relazione logica tra i concetti semantici riferiti.
16
Gli URI utilizzati all’interno dell’attributo modelReference possono identificare concetti espressi in linguaggi semantici diversi.
17L’XSLT (eXtensible Stylesheet Language Transformations) `e un linguaggio per la
Il primo elemento (OrderRequest) `e dotato anche dell’attributo lowering- SchemaMapping, il quale consente di fare riferimento al file rappresentato nel listato 1.4. Quest’ultimo si compone di due sezioni, la prima contenente una query SPARQL utilizzabile per selezionare un insieme di dati presenti nel modello semantico rappresentato dal listato 1.3 e la seconda contenen- te una trasformazione XSLT mediante la quale risulta possibile creare un documento XML che utilizzi i dati estratti dalla suddetta query SPARQL. Per quanto riguarda invece il secondo elemento (OrderResponse), esso `e dotato dell’attributo liftingSchemaMapping, il quale consente di fare riferi- mento alla trasformazione XSLT rappresentata nel listato 1.5, utilizzabile per creare un modello semantico a partire da un documento XML conforme all’XML Schema considerato nell’esempio.
Listato 1.2: XML Schema relativo alla gestione di un ordine.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.w3.org/2002/ws/sawsdl/spec/wsdl/ order#"
elementFormDefault="qualified"> <xs:element name="OrderRequest"
sawsdl:modelReference="http://www.w3.org/2002/ws/sawsdl/spec/ontology/ purchaseorder#OrderRequest" sawsdl:loweringSchemaMapping="http://www.w3.org/2002/ws/sawsdl/spec/ mapping/RDFOnt2Request.xslt"> <xs:complexType> <xs:sequence>
<xs:element name="customerNo" type="xs:integer" /> <xs:element name="orderItem" type="item" minOccurs="1"
maxOccurs="unbounded" /> </xs:sequence>
</xs:complexType> </xs:element>
<xs:complexType name="item"> <xs:all>
<xs:element name="UPC" type="xs:string" /> </xs:all>
<xs:attribute name="quantity" type="xs:integer" /> </xs:complexType>
<xs:element name="OrderResponse" type="confirmation" /> <xs:simpleType name="confirmation"
sawsdl:modelReference="http://www.w3.org/2002/ws/sawsdl/spec/ontology/ purchaseorder#OrderConfirmation"
sawsdl:liftingSchemaMapping="http://www.w3.org/ws/sawsdl/spec/mapping/ Response2Ont.xslt">
<xs:restriction base="xs:string"> <xs:enumeration value="Confirmed" /> <xs:enumeration value="Pending" /> <xs:enumeration value="Rejected" /> </xs:restriction>
</xs:simpleType> </xs:schema>
1.6 Web services ed annotazione semantica 19
Listato 1.3: Ontologia OWL relativa alla gestione di un ordine.
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xml:base="http://www.w3.org/2002/ws/sawsdl/spec/ontology/ purchaseorder#">
<owl:Ontology />
<owl:Class rdf:ID="OrderRequest" /> <owl:ObjectProperty rdf:ID="hasLineItems">
<rdfs:domain rdf:resource="#OrderRequest" /> <rdfs:range rdf:resource="#LineItem" /> </owl:ObjectProperty>
<owl:FunctionalProperty rdf:ID="hasCustomer"> <rdfs:domain rdf:resource="#OrderRequest" /> <rdfs:range rdf:resource="#Customer" />
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty" /
>
</owl:FunctionalProperty> <owl:Class rdf:ID="LineItem" />
<owl:ObjectProperty rdf:ID="hasQuantity"> <rdfs:domain rdf:resource="#LineItem" /> <rdfs:range rdf:resource="#Quantity" /> </owl:ObjectProperty>
<owl:FunctionalProperty rdf:ID="hasProduct"> <rdfs:domain rdf:resource="#LineItem" /> <rdfs:range rdf:resource="#Product" />
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty" /
>
</owl:FunctionalProperty> <owl:Class rdf:ID="Customer" />
<owl:FunctionalProperty rdf:ID="hasCustomerID"> <rdfs:domain rdf:resource="#Customer" /> <rdfs:range rdf:resource="#CustomerID" />
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty" /
>
<rdfs:subPropertyOf rdf:resource="#hasIdentifier" /> </owl:FunctionalProperty>
<owl:Class rdf:ID="CustomerID">
<rdfs:subClassOf rdf:resource="#Identifier" /> </owl:Class>
<owl:Class rdf:ID="Product" />
<owl:FunctionalProperty rdf:ID="hasProductCode"> <rdfs:domain rdf:resource="#Product" /> <rdfs:range rdf:resource="#ProductCode" />
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty" /
>
<rdfs:subPropertyOf rdf:resource="#hasIdentifier" /> </owl:FunctionalProperty>
<owl:Class rdf:ID="UPCCode">
<rdfs:subClassOf rdf:resource="#ProductCode" /> </owl:Class>
<owl:Class rdf:ID="ProductCode">
<rdfs:subClassOf rdf:resource="#Identifier" /> </owl:Class>
<owl:FunctionalProperty rdf:ID="hasLexicalRespresentation"> <rdfs:domain rdf:resource="#Identifier" />
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string" /> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"
/>
</owl:FunctionalProperty> <owl:Class rdf:ID="Quantity" />
<owl:DatatypeProperty rdf:ID="hasAmount"> <rdfs:domain rdf:resource="#Quantity" />
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#float" /> </owl:DatatypeProperty>
<owl:ObjectProperty rdf:ID="hasUnit"> <rdfs:domain rdf:resource="#Quantity" /> <rdfs:range rdf:resource="#Unit" /> </owl:ObjectProperty>
<owl:Class rdf:ID="Unit" />
<owl:Class rdf:ID="ItemUnavailable" /> <owl:Class rdf:ID="OrderConfirmation" /> <owl:FunctionalProperty rdf:ID="hasStatus">
<rdfs:domain rdf:resource="#OrderConfirmation" />
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string" /> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"
/>
</owl:FunctionalProperty>
<owl:ObjectProperty rdf:ID="hasIdentifier">
<rdfs:domain rdf:resource="http://www.w3.org/2002/07/owl#Thing" /> <rdfs:range rdf:resource="#Identifier" />
</owl:ObjectProperty>
<owl:Class rdf:ID="RequestPurchaseOrder" /> </rdf:RDF>
Listato 1.4: Trasformazione XSLT da triple RDF a documento XML.
<?xml version="1.0" encoding="UTF-8"?>
<lowering> <sparqlQuery>
PREFIX po: <http://www.w3.org/2002/ws/sawsdl/spec/ontology/
purchaseorder#>
SELECT ?qty ?UPC ?CustomerNo WHERE {
?order po:hasCustomer ?customer . ?customer po:hasCustomerID ?id .
?id po:hasLexicalRespresentation ?CustomerNo . ?order po:hasLineItems ?item .
?item po:hasQuantity ?qtyClass . ?qtyClass po:hasAmount ?qty . ?item po:hasProduct ?product .
?product po:hasProductCode ?code .
?code po:hasLexicalRespresentation ?UPC } </sparqlQuery>
1.6 Web services ed annotazione semantica 21
<xsl:transform version="2.0"
xmlns:po="http://www.w3.org/2002/ws/sawsdl/spec/wsdl/order#"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sp="http://www.w3.org/2005/sparql-results#">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent=" yes" />
<xsl:template match="/sp:sparql"> <po:OrderRequest> <po:customerNo> <xsl:value-of select="sp:results/sp:result[position()=1]/sp:binding[@name=’ CustomerNo’]/sp:literal" /> </po:customerNo>
<xsl:apply-templates select="sp:results/sp:result" /> </po:OrderRequest>
</xsl:template>
<xsl:template match="sp:result"> <po:orderItem>
<xsl:attribute name="quantity">
<xsl:value-of select="sp:binding[@name=’qty’]/sp:literal" /> </xsl:attribute>
<po:UPC>
<xsl:value-of select="sp:binding[@name=’UPC’]/sp:literal" /> </po:UPC>
</po:orderItem> </xsl:template> </xsl:transform> </lowering>
Listato 1.5: Trasformazione XSLT da documento XML a triple RDF.
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:po="http://www.w3.org/2002/ws/sawsdl/spec/wsdl/order#" xmlns:POOntology="http://www.w3.org/2002/ws/sawsdl/spec/ontology/ purchaseorder#">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"
/>
<xsl:template match="/"> <rdf:RDF>
<POOntology:OrderConfirmation>
<hasStatus rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> <xsl:value-of select="po:OrderResponse" />
</hasStatus>
</POOntology:OrderConfirmation> </rdf:RDF>
</xsl:template> </xsl:transform>