Support for CONSTRUCT and DESCRIBE was added
(http://cia.vc/stats/project/rdflib/.message/32e38)  the RDFLib SPARQL
module.  A doctest (commited to the test subdirectory) is listed
below.  The implementation passes all the CONSTRUCT tests in the DAWG
test suite.

================================================================
Advanced SPARQL: CONSTRUCT, user-defined DESCRIBE and extensions
================================================================

I. CONSTRUCT support

CONSTRUCT queries are supported and differ from SELECT/ASK queries
primarily in that the rdflib.sparql.SPARQLQueryResultQueryResult object returned
will forward the format argument to the serialize method of the 'constructed'
graph.  The 'result' attribute will be set to an instance of this constructured
(in-memory) Graph.

    >>> testGraph.query(
    ...   "CONSTRUCT { ex:Alice vcard:FN ?name }\
    ...    WHERE     { ?x foaf:name ?name }",
    ...   initNs=namespaces,
    ...   ).serialize(format='nt')
    '<http://example.org/person#Alice>
<http://www.w3.org/2001/vcard-rdf/3.0#FN> "Alice".\n'

The result of a CONSTRUCT can be parsed into a graph

    >>> rt=testGraph.query(
    ...   "CONSTRUCT { ex:Alice vcard:FN ?name }\
    ...    WHERE     { ?x foaf:name ?name }",
    ...   initNs=namespaces,
    ...   ).serialize(format='xml')
    >>> [ (s.n3(),
    ...    p.n3(),
    ...    o.n3()) for s,p,o in Graph().parse(StringIO(rt))]
    [(u'<http://example.org/person#Alice>',
u'<http://www.w3.org/2001/vcard-rdf/3.0#FN>', u'"Alice"')]

II. User-defined DESCRIBE

Describe support is implemented by allowing the user to pass in a
method which takes
as arguments: the terms listed in the DESCRIBE expression, a solution binding,
and the underlying dataset Graph (a ConjunctiveGraph/Graph) and
returns an description
graph (a Graph instance).  The default describe method will simply return all
incoming and outgoing statements as the resulting graph:

===============================================================================
def describe(terms,bindings,graph):
    """
    Default DESCRIBE returns all incomming and outgoing statements about the
    given terms
    """
    from rdflib.sparql.sparqlOperators import getValue
    g=Graph()
    terms=[getValue(i)(bindings) for i in terms]
    for s,p,o in graph.triples_choices((terms,None,None)):
        g.add((s,p,o))
    for s,p,o in graph.triples_choices((None,None,terms)):
        g.add((s,p,o))
    return g
===============================================================================

    >>> rt=testGraph.query(
    ...   "DESCRIBE  ?x WHERE  { ?x foaf:name ?name }",
    ...   initNs=namespaces
    ...   ).result
    >>> len(rt)
    2

A user-defined method is specified by passing it in as an extension
function bound to
<http://www.w3.org/TR/rdf-sparql-query/#describe>

    >>> rt=testGraph.query(
    ...   "DESCRIBE  ?x WHERE  { ?x foaf:name ?name }",
    ...   initNs=namespaces,
    ...   extensionFunctions={DESCRIBE:describeOverride}
    ...   ).result
    >>> list(rt)
    [(rdflib.BNode('.........'),
rdflib.URIRef('http://xmlns.com/foaf/0.1/mbox'),
rdflib.URIRef('mailto:[EMAIL PROTECTED]'))]
    >>> [ (s.n3(),
    ...    p.n3(),
    ...    o.n3()) for s,p,o in rt]
    [(u'_:.........', u'<http://xmlns.com/foaf/0.1/mbox>',
u'<mailto:[EMAIL PROTECTED]>')]
_______________________________________________
Dev mailing list
Dev@rdflib.net
http://rdflib.net/mailman/listinfo/dev

Reply via email to