xquery printable version

Quelques notes sur XQuery

XQuery définit deux syntaxes :

  1. FLOWR, For-Let-OrderBy-Where-Return, qui est le pendant du SQL Select-From-Where.
  2. XQueryX, XML Syntax for XML Query, qui est un document XML (et donc plus est une syntaxe plus verbeuse).

Le FLOWR apporte des fonctionnalité de jointure aux documents XML.

  • For: crée une séquence de tuple.
  • Let: crée un lien entre une variable et une séquence.
  • Where: filtre les tuples par une expression booléenne.
  • OrderBy: pour le tri des tuples.
  • Return: ce qui est a retourner pour l'évaluation pour chaque tuple.

Pour référencer un attribute node, il faut préfixer le nom de l'attribut par le caractère @, par exemple: /Node1/@class

Pour obtenir un distinct, on utilise la fonction XQuery distinct-values, par exemple: distinct-values(/Node1)

Quand on utilise un XQuery path, on obtient en retour un result set, et on peut filtrer ce result set avec des predicates. Les prédicats sont toujours contenus entre brackets [], et il y a deux types de prédicats que l'on peut utiliser: numérique ou booléens.

  • prédicats numériques: /node1/node2/node3[2]
  • prédicats booléens: par exemple sur une évaluation du text node /Node1/Node2[Node3=“Node3 text 3”]

Scripts XQuery / module MonetDB pour LabelMe

module namespace labelme = "labelme";

declare document management function labelme:addAnnotationFile($doc as xs:string, $name as xs:string)
{ pf:add-doc($doc, $name, 10) };

declare document management function labelme:addAnnotationFile($doc as xs:string, $name as xs:string, $collection as xs:string)
{ pf:add-doc($doc, $name, $collection, 10) };

declare document management function labelme:addAnnotationFiles($uris as xs:string*, $docs as xs:string*, $col as xs:string) 
{ 
	for $i in 1 to count($uris)  
		let $uri := exactly-one($uris[$i])
		let $doc := exactly-one($docs[$i])
    	return pf:add-doc($uri, $doc, $col, 10)
};

declare document management function labelme:addAnnotationFiles2($uris as xs:string*, $docs as xs:string*, $cols as xs:string*) 
{ 
	for $i in 1 to count($uris)  
		let $uri := exactly-one($uris[$i])
		let $doc := exactly-one($docs[$i])
		let $col := exactly-one($cols[$i])
    	return pf:add-doc($uri, $doc, $col, 10)
};

declare document management function labelme:deleteDocument($doc as xs:string) 
{ pf:del-doc($doc) };

declare function labelme:getAnnotations() as xs:string*
{
	for $i in (pf:documents()/text())
		for $j in (doc($i)/annotation/object/name/text())
			return <annotationValue> { $j } </annotationValue>
};

(: This function return which documents contain a object annotated with the annotation
given in parameter. There is no explode of the annotation string and no keyword search,
this function consider annotation like free-text annotation :)
declare function labelme:searchByAnnotation($annotation as xs:string) as xs:string*
{ 
	for $i in (pf:documents()/text()) 
	where doc($i)/annotation/object/name=$annotation
		return <LabelMeDocument><folder> { doc($i)/annotation/folder/text() } </folder><filename> { doc($i)/annotation/filename/text() } </filename></LabelMeDocument>
};

declare updating function labelme:addVisualInstance($filename as xs:string, $new_instance as item()*)
{
	do insert $new_instance as last into doc($filename)//annotation
};
 
xquery.txt · Last modified: 2009/04/07 16:13 by nicolas

 Valid XHTML 1.0 Transitional Valid CSS! DokuWiki