rif xml syntax (again)

I'm working on a more concrete RIF XML Syntax proposal, trying to nail
down the various issues that have been floating around.  Here's a run
through of the issues, each with a proposed solution, and finally an
example of a simple ruleset using this syntax.  

I do not yet have an XML schema for this, which I know I'm supposed to
produce, and I don't have software to translate between this and any
other formats yet -- I just doing it by hand at the moment.  I expect to
do more on this before Tuesday, but I wanted to get at least this out
now.

      -- Sandro

================================================================


ISSUE 1.  Leaf Class == Visible Class

See thread starting with
   http://lists.w3.org/Archives/Public/public-rif-wg/2007Jul/0055

PROPOSED/USED: visibility of syntactic classes is determined and indicated 
          solely by their place in the syntactic class hierarchy 
          (ie change "TERM" to "Term", etc.)

(otherwise classes can't be visible in some dialects and invisible in
others.)

================

ISSUE 2.  Const vs Literal

See thread starting around
   http://lists.w3.org/Archives/Public/public-rif-wg/2007Jul/0081.html

PROPOSED/USED: change the abstract syntax for Term to be this:


    class Term
    
        subclass Var
            property name: xs:string
    
        subclass Constant

            subclass Literal

                 subclass TypedLiteral     # for example:   3.1
                     property datatype: xs:anyURI
                     property lexicalRepresentation: xs:string

                 subclass PlainLiteral     # for example:   "Hello"
                     property content: xs:string
                     property language: xs:string?

            subclass NamedConstant

                subclass GlobalConstant    # for example:   http://eg.org#p
                     property name: xs:anyURI
    
                subclass LocalConstant     # for example:  p
                     property name: xs:string
        
        subclass Uniterm       
            property op: Const
            property arg: list of TERM

NOTE that some of this structure is not visible in the RIF XML syntax.
For example, a PlainLiteral value is serialized by just including the
text value -- the property name "content" is not used.

================
    
ISSUE 3.  xsi:type vs rdf:datatype

There are two different conventions for indicating the datatype of a
literal data value occuring in an instance document.  Unfortunately,
they do not appear to be compatible; there appears to be no way to
specify xsi:type in RDF/XML.

Note that the SPARQL results format (which is not RDF/XML) used
xsi:type in one version and then took it out.  See
http://www.w3.org/TR/2005/WD-rdf-sparql-XMLres-20050801/#changes
I don't know the full story there.

PROPOSED/USED: Use rdf:datatype instead of xsi:type

================

ISSUE 4.  rdf:RDF vs rif:Document document-level wrapper

rdf:RDF isn't necessary for RDF/XML, but some apps (like RDF
Validator) seem to require it anyway.    It helps make it clear that
this is intended to be parseable as RDF.

PROPOSED/USED: use rdf:RDF wrapper

================

ISSUE 5.  Literal data values in lists

Unfortunately, RDF/XML parsetype="Collection" does not allow literal
data values.  (very, very annoying.)  So how do you write a condition
like p(5)?

Here are the options I see (written in Turtle, to make it clear what
triples are actually being conveyed in the RDF/XML).

 OPTION 1

    Define a non-standard dialect of RDF/XML, "RDF/XML with the li
    patch", which allows "rdf:li" to be used to put literals into
    lists.

    [ a rif:Uniterm;
      rif:op [ a rif:LocalConstant; rif:name "p" ];
      rif:arg ( "5"^^xs:int )
    ]

 OPTION 2

    Use a bnode which is owl:sameAs the desired value.

    [ a rif:Uniterm;
      rif:op [ a rif:LocalConstant; rif:name "p" ];
      rif:arg ( 
          [ owl:sameAs "5"^^xs:int ]
      )         
   ]

 OPTION 3

    Use a bnode which is has a rif:value of the desired value.

    [ a rif:Uniterm;
      rif:op [ a rif:LocalConstant; rif:name "p" ];
      rif:arg ( 
          [ rif:value "5"^^xs:int ]
      )
   ]

 OPTION 4

    Use a bnode which is has a rdf:value of the desired value.

    [ a rif:Uniterm;
      rif:op [ a rif:LocalConstant; rif:name "p" ];
      rif:arg ( 
          [ rdf:value "5"^^xs:int ]
      )
   ]

 OPTION 5

    Don't try to use RDF datatypes -- just fully serialize our
    abstract syntax.

    [ a rif:Uniterm;
      rif:op [ a rif:LocalConstant; rif:name "p" ];
      rif:arg ( 
          [ a rif:TypedLiteral;
            rif:datatype "http://www.w3.org/2001/XMLSchema#int";
            rif:lexicalRepresentation "5" ]
      )
   ]

 OPTION 6 

   Don't use parsetype Collection -- just use first/rest

 OPTION 7

   Don't use rdf:Lists at all -- use rdf:Seq.

   Concerns -- rdf:Seq support is weak.  Can the values be constrained
   using OWL?  It's not closed -- you don't know if you have a partial
   graph.   Would that ever matter....?

 OPTION 8

   Don't try to use RDF/XML   :-)


PROPOSED/USED: OPTION 4 (rdf:value)     [but I don't like any of the options]

================

ISSUE 6.  Use multivalues instead of lists where order has no meaning

The current abstract syntax says things like:

  class Ruleset
     property formula : list of Rule

although the order of rules in a ruleset has no semantics in BLD.  

PROPOSED/USED: have an unordered collection mechanism in ASN07, written
          using the Kleene operators (*,+,?), and using them for such
          cases, like this: 

  class Ruleset
     property formula : Rule*

  class Forall
     property declare: Var*
     property formula: Clause

================

ISSUE 7.  Allow structure sharing, so that instead of 

         ...
	    <op>
	      <GlobalConstant>
		<name>http://example.com/app#p</name>
	      </GlobalConstant>
	    </op>
         ...

repeated wherever we need app:p, we say:

         ...
	    <op>
	      <GlobalConstant rdf:nodeId="p">
		<name>http://example.com/app#p</name>
	      </GlobalConstant>
	    </op>
         ...

the first time, and 

	    <op rdf:nodeId="p" />

each later time.

PROPOSED/USED:  Allow syntactic structure sharing.


================================================================

<!--   

ruleset7:   app:p(1).
            app:q(1).
            all X app:p(X) & app:q(X) -> app:r(X).

Parses to 55 triples.
(That's about one triple per character of the above informal 
presentation syntax.  :-)

-->


<!DOCTYPE rdf:RDF [
 <!ENTITY xsd     "http://www.w3.org/2001/XMLSchema-datatypes#">
]>
<rdf:RDF xmlns="http://www.w3.org/2007/rif#"
	 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	 xmlns:rif="http://www.w3.org/2007/rif#"
	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xmlns:xsd="&xsd;"
	 >
  <Ruleset>

    <!--  app:p(1).  -->
    <formula>
      <Forall>
	<formula>
	  <Uniterm>
	    <op>
	      <GlobalConstant rdf:nodeID="p">
		<name>http://example.com/app#p</name>
	      </GlobalConstant>
	    </op>
	    <arg rdf:parseType="Collection">
                <rdf:Description>
		  <value rdf:datatype="&xsd;integer">1</value>
		</rdf:Description>
	    </arg>
	  </Uniterm>
	</formula>
      </Forall>
    </formula>

    <formula>
      <!--  app:q(1).  -->
      <Forall>
	<formula>
	  <Uniterm>
	    <op>
	      <GlobalConstant rdf:nodeID="q">
		<name>http://example.com/app#q</name>
	      </GlobalConstant>
	    </op>
	    <arg rdf:parseType="Collection">
                <rdf:Description>
		  <value rdf:datatype="&xsd;integer">1</value>
		</rdf:Description>
	    </arg>
	  </Uniterm>
	</formula>
      </Forall>
    </formula>

    <!--  forall X app:p(X) & app:q(X) -> app:r(1).  -->
    <formula>
      <Forall>
	<declare>
	  <Var rdf:nodeID="X">
	    <name>X</name>
	  </Var>
	</declare>
	<formula>
	  <Implies>
	    <if>
	      <And>
		<formula rdf:parseType="Collection">

		  <!-- app:p(X) -->
		  <Uniterm>
		    <op rdf:nodeID="p" />
		    <arg rdf:parseType="Collection">
		      <rdf:Description rdf:nodeID="X" />
		    </arg>
		  </Uniterm>

		  <!-- app:q(X) -->
		  <Uniterm>
		    <op rdf:nodeID="q" />
		    <arg rdf:parseType="Collection">
		      <rdf:Description rdf:nodeID="X" />
		    </arg>
		  </Uniterm>
		  
		</formula>
	      </And>
	    </if>
	    <then>

	      <!-- app:r(X) -->
	      <Uniterm>
		<op>
		  <GlobalConstant>
		    <name>http://example.com/app#r</name>
		  </GlobalConstant>
		</op>
		<arg rdf:parseType="Collection">
		  <rdf:Description rdf:nodeID="X" />
		</arg>
	      </Uniterm>

	    </then>
	  </Implies>
	</formula>
      </Forall>
    </formula>

  </Ruleset>
</rdf:RDF>

Received on Friday, 24 August 2007 18:22:20 UTC