[Monetdb-developers] trying to use monetdb pathfinder

Jens Teubner jens.teubner at in.tum.de
Thu Feb 8 09:56:27 CET 2007

On Mon, Feb 05, 2007 at 09:08:59PM +0100, Martijn Faassen wrote:

> First, I was testing the xquery support. I tried to shred a document
> like this:
> shred_doc('/home/faassen/xml/shaks/hamlet.xml', 'hamlet')

shred_doc() is actually a deprecated interface to MonetDB/XQuery's
document management.  In the meantime we integrated document management
into the query language itself, so you will no longer need to work with
MIL for the document management and XQuery for the queries.

The recommended way to load documents into MonetDB/XQuery is now the
(XQuery) function pf:add-doc():

 pf:add-doc (URI, alias)    -> load document from URI and store it under
                               the name alias (similar to shred_doc())

 pf:add-doc (URI, alias, coll) -> same, but add document to the
                                  collection coll

 pf:add-doc (URI, alias, pct) -> leave pct % free space for future

The latter two variants can have performance advantages depending on
your scenario.

Note that if you want to use shred_doc() in MIL, you need to specify
both arguments as MIL strings, i.e., in double quotes.

> doc('/home/faassen/xml/shaks/hamlet.xml')//FM
> and this gets a step further (still wondering why the former didn't 
> work, though):
> MAPI  = monetdb at localhost:50000
> QUERY = doc('/home/faassen/xml/shaks/hamlet.xml')//FM
> ERROR = !ERROR: I/O warning : failed to load external entity "play.dtd"
>          !ERROR: [shred_url]: 1 times inserted nil due to errors at 
> [...]
> The play.dtd is in the directory next to 'hamlet.xml', so don't know why 
> that doesn't work either.

Sorry, I currently don't know what could have gone wrong here.  Anyone
else on the list can give an answer?

MonetDB/XQuery, by the way, uses DTDs to know about ID and IDREF
attributes.  The id() and idref() functions will only be supported if ID
and IDREF attributes have been declared in the DTD.  (Also, an
additional index will be created to efficiently back id() and idref().)

> Next, I was trying out the xquery update support. Not hindered by any 
> knowledge on how it works, I went to the referenced W3C document and 
> adapted the first insert statement I saw there into this:
> do insert <year>2005</year>
>    after fn:doc('/home/faassen/xml/shaks/hamlet2.xml')/PLAY/TITLE
> This however gives me an error message I do not understand:
> MAPI  = monetdb at localhost:50000
> QUERY = do insert <year>2005</year>
>            after fn:doc('/home/faassen/xml/shaks/hamlet2.xml')/PLAY/TITLE
> ERROR = !type error: no variant of function upd:insertAfter accepts the 
> given argument type(s): element TITLE { item* }*; (node* | node)*
>          !type error: maybe you meant:
>          !type error:   upd:insertAfter (node, node*) as stmt
>          !type error: illegal arguments for function upd:insertAfter

The problem is that the expression `fn:doc(...)/PLAY/TITLE' could
evaluate to a list of nodes.  The `do insert ... after ...' clause,
however, is only allowed for single nodes as the target expression.

The Pathfinder XQuery compiler does static type checking.  And if your
query is not type-safe it will be rejected.  If you are sure that your
path evaluates to exactly one node, you can tell that to the compiler
and it will (at least it should ;-)) accept your query:

  do insert ...  after exactly-one (fn:doc (...)/PLAY/TITLE)

Other way to make sure that the target expression evaluates to exactly
one node include

  for $n in fn:doc (...)/PLAY/TITLE return
    do insert ... after $n

I hope I could help you a bit.  Don't hesitate to ask again.


Jens Teubner
Technische Universitaet Muenchen, Department of Informatics
D-85748 Garching, Germany
Tel: +49 89 289-17259     Fax: +49 89 289-17263

                 XQuery processing at the speed of light: MonetDB/XQuery
       http://www.monetdb-xquery.org/  http://www.pathfinder-xquery.org/

More information about the developers-list mailing list