- From: David Martin <martin@AI.SRI.COM>
- Date: Tue, 03 Jan 2006 23:19:03 -0800
- To: public-sws-ig <public-sws-ig@w3.org>
David Martin wrote:
>
> This message is meant to summarize new directions regarding the
> grounding part of OWL-S. These new directions will show up in OWL-S
> 1.2, subject of course to any further evolution that results from
> discussion on this list. These directions have arisen from
> discussions within the OWL-S Coalition. (Evren, Naveen, Massimo and
> Daniel and all please check me on this message and feel free to chime
> in if anything needs further clarification).
>
> The first thing to note is that these new directions do not involve
> any ontology changes (except for one minor exception that's noted near
> the end of this message). Rather they involve new conventions
> regarding the relationship between the parameters and preconditions of
> atomic processes and the WSDL script specified by a grounding.
>
> The second thing to note is that here we are dealing with the case
> where an XSLT script is used to generate an input message for a WSDL
> operation. (There are a couple other cases that aren't addressed in
> this message.)
>
> In the past we assumed that the input to the WSDL script was some
> atomic process input expressed in OWL (i.e., as an OWL instance
> expressed in the XML/RDF syntax). That assumption had some problems,
> so now the new approach is to pass values into the WSDL script by
> means of variable / param bindings. Specifically, variables that
> appear in an atomic process precondition get bound to values when that
> precondition is evaluated, and those values also get bound to params
> that appear in an XSLT script. The XSLT script then can produce a
> WSDL input message that includes those values.
>
> The precondition should be arranged so that all values required by the
> XSLT script are assigned either to input parameters or to local
> variables of the atomic process.
>
> XSLT params should be defined using the URIs of the required input
> parameters and local variables, as illustrated in the example below.
>
> We note that the binding of the XSLT params will not come "for free";
> that is, XSLT software will not know where to get those values
> from. That binding will need to be done by the execution environment
> (e.g., by preprocessing the XSLT script before it is evaluated).
>
> OWL-S allows that preconditions can be expressed in a variety of logic
> languages, including e.g. SWRL, DRS, RDQL, SPARQL, and KIF. Here's an
> example that employes SWRL. The thing to notice about this example is
> simply that evaluation of this precondition binds local variables
> #Firstname, #Lastname, and #Title to values contained in the input
> #Book. These same values are then plugged in to the XSLT script (as
> xsl:params) when it gets processed. The precondition is the following
> query expressed in SWRL:
>
> (?Book :hasAuthor ?Author)
> (?Author :hasFirstname ?Firstname)
> (?Author :hasLastname ?Lastname)
> (?Book :hasTitle ?Title)
>
> Also note that the grounding is still based on WSDL 1.1 (hence the
> reference to wsdlMessagePart), but this will be updated soon.
>
> ===== BEGIN EXAMPLE
> <!-- For simplicity we omit the definitions of Book, Firstname,
> Lastname, Title
>
> "congo" is the namespace prefix for the example
> ("http://www.example.org/congo")
> "congo_wsdl" is the namespace prefix for the WSDL spec
> "p" is the namespace prefix for owl-s/1.2/Process.owl
> "e" is the namespace prefix for owl-s/1.2/generic/Expression.owl
> "e" is the namespace prefix for owl-s/1.2/Grounding.owl
>
> -->
>
> <p:AtomicProcess rdf:ID="BookInfo">
> <p:hasInput rdf:resource="#Book">
> <p:hasLocal rdf:resource="#Firstname">
> <p:hasLocal rdf:resource="#Lastname">
> <p:hasLocal rdf:resource="#Title">
>
> <p:hasPrecondition>
> <e:Expression>
> <e:expressionObject parsetype="Collection">
> <swrl:IndividualPropertyAtom>
> <swrl:propertyPredicate rdf:resource="publ:hasAuthor"/>
> <swrl:argument1 rdf:resource="#Book"/>
> <swrl:argument2 rdf:resource="#Author"/>
> </swrl:IndividualPropertyAtom>
> <swrl:IndividualPropertyAtom>
> <swrl:propertyPredicate
> rdf:resource="publ:hasFirstname"/>
> <swrl:argument1 rdf:resource="#Author"/>
> <swrl:argument2 rdf:resource="#Firstname"/>
> </swrl:IndividualPropertyAtom>
> <swrl:IndividualPropertyAtom>
> <swrl:propertyPredicate
> rdf:resource="publ:hasFirstname"/>
> <swrl:argument1 rdf:resource="#Author"/>
> <swrl:argument2 rdf:resource="#Lastname"/>
> </swrl:IndividualPropertyAtom>
> <swrl:IndividualPropertyAtom>
> <swrl:propertyPredicate rdf:resource="publ:hasTitle"/>
> <swrl:argument1 rdf:resource="#Book"/>
> <swrl:argument2 rdf:resource="#Title"/>
> </swrl:IndividualPropertyAtom>
> </e:expressionObject>
> </e:Expression>
> </e:hasPrecondition>
> </e:AtomicProcess>
>
> <g:WsdlAtomicProcessGrounding>
> <g:owlsProcess rdf:resource="#BookInfo>
> <g:wsdlInput>
> <g:XSLTInputMessageMap>
> <grounding:wsdlMessagePart rdf:datatype="&xsd;#anyURI">
> congo_wsdl:BookInfoMessagepart
> </grounding:wsdlMessagePart>
> <g:xsltTransformationString>
> <![CDATA[
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:congo="http://www.example.org/congo">
>
> <xsl:param name="congo:Firstname"/>
> <xsl:param name="congo:Lastname"/>
> <xsl:param name="congo:Title"/>
>
> <xsl:template match="/">
> <Book>
> <author>
> <xsl:value-of select="$congo:Firstname"/>
> <xsl:value-of select="$congo:Lastname"/>
> </author>
> <title>
> <xsl:value-of select="$congo:Title"/>
> </title>
> </Book>
> </xsl:template>
> </xsl:stylesheet>
> ]]>
> </g:xsltTransformationString>
> </g:XSLTInputMessageMap>
> </g:wsdlInput>
> </g:WsdlAtomicProcessGrounding>
> ===== END EXAMPLE
>
> Final note: In SWRL and DRS the input parameters and local parameters
> can be mentioned by their URI. But that isn't true of SPARQL, RDQL,
> and KIF. When one of those languages is used a mapping is needed that
> explicitly shows the correspondence between atomic process variables
> and the corresponding variables mentioned in the precondition. This
> requires a minor extension to the existing grounding ontology (which
> was mentioned at the beginning of this message). This will be
> described in a separate message.
In wrapping up loose ends for the 1.2 release, I've addressed the
above by adding the following class VariableBinding and 3 related
properties, in Expression.owl. These can be used to define a
correspondence between a variable mentioned in a quoted expression and
an OWL instance. This is useful with expression languages (such as
KIF, RDQL, and SPARQL) in which the variables aren't identified using
URIs.
variableBinding
domain=QuotedExpression,
range=VariableBinding
VariableBinding
theVariable
theObject
The full declarations are given below. I believe this is all
straightforward and non-controversial, but (as always) comments are
welcome.
These changes were arrived at in OWL-S Coalition telecons, and also in
discussions with Daniel Elenius.
<owl:ObjectProperty rdf:ID="variableBinding">
<rdfs:domain rdf:resource="#QuotedExpression"/>
<rdfs:range rdf:resource="#VariableBinding"/>
</owl:ObjectProperty>
<owl:Class rdf:ID="VariableBinding">
<rdfs:comment>
This class is used to define a correspondence between a variable
mentioned in an quoted expression and an OWL instance. This is
useful with expression languages in which the variables
can't be identified using URIs.
</rdfs:comment>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#theVariable"/>
<owl:cardinality
rdf:datatype="&xsd;#nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#theObject"/>
<owl:cardinality
rdf:datatype="&xsd;#nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:DatatypeProperty rdf:ID="theVariable">
<rdfs:comment>
The value of this property is a substring of a QuotedExpression.
The substring represents a variable in the language of the
QuotedExpression. For example, if the QuotedExpression is in KIF,
the substring would be something like "?a".
</rdfs:comment>
<rdfs:domain rdf:resource="#VariableBinding"/>
</owl:DatatypeProperty>
<owl:ObjectProperty rdf:ID="theObject">
<rdfs:comment>
The range is not defined, and so the value of this property can
be any OWL instance.
When used to bind an OWL-S process precondition variable, however,
the value of this property must be an instance of process:Parameter.
</rdfs:comment>
<rdfs:domain rdf:resource="#VariableBinding"/>
</owl:ObjectProperty>
(The 1.2 - still draft - version of Expression.owl is here:
http://www.daml.org/services/owl-s/1.2/generic/Expression.owl.)
Cheers,
David
Received on Wednesday, 4 January 2006 07:19:11 UTC