
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 updates 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@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@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 -- 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/