--- /dev/null
+GRAMMATICA PER QUERY SU DOCUMENTI MATEMATICI
+ VERSIONE IMPLEMENTATA
+MATHEMATICAL QUERY LANGUAGE (MathQL)
+
+<query> := <list> (* clausola iniziale *)
+
+<list> := ( <list> ) (* parentesizazione *)
+ | <rvar> (* lista singoletto var
+ (lista valori) *)
+ | <lvar> (* lista singoletto var
+ (lista valori) *)
+ | REFERENCE <reference> (* oggetto referenziato da URI
+ esplicita *)
+ | PATTERN <pattern> (* espansione del pattern *)
+ | SELECT <rvar> IN <list> WHERE <bool> (* selezione *)
+ | LET <lvar> BE <list> IN <list> (* assegnazione a var in
+ contesto *)
+ | USE <list> POSITION <svar> (* unione lista backward *)
+ | USEDBY <list> POSITION <svar> (* unione lista forward *)
+ | <list> UNION <list> (* unione *)
+ | <list> INTERSECT <list> (* intersezione *)
+ | <list> SORTEDBY <function> <order> (* unione lista ordinata secondo
+ valore funzione e ordine *)
+<order>:= DESC (* ordinamento decrescente *)
+ | ASC (* ordinamento crescente *)
+
+<bool> := ( <bool> ) (* parentesizzazione *)
+ | TRUE (* vero *)
+ | FALSE (* falso *)
+ | NOT <bool> (* negazione *)
+ | <bool> AND <bool> (* congiunzione *)
+ | <bool> OR <bool> (* disgiunzione *)
+ | <string> IS <string> (* case sensitive matching *)
+ | <list> SETEQUAL <list> (* uguaglianza tra liste *)
+ | <list> SUBSET <list> (* operazione di sottoinsieme *)
+
+<string> := <'-quoted-constant-string> (* costante letterale *)
+ | MAINHYPOTHESIS | HYPOTHESIS (* costanti simboliche *)
+ | MAINCONCLUSION | CONCLUSION | BODY
+ | <svar> (* variabile *)
+ | <rvar> (* variabile *)
+ | <function> <rvar> (* applicazione di funzione *)
+
+<function> := NAME (* URIREF -> nome_oggetto *)
+ | TITLE (* URIREF -> valore_prop_DC *)
+ | CONTRIBUTOR
+ | CREATOR
+ | PUBLISHER
+ | SUBJECT
+ | DESCRIPTION
+ | DATE
+ | TYPE
+ | FORMAT
+ | IDENTIFIER
+ | LANGUAGE
+ | RELATION
+ | SOURCE
+ | COVERAGE
+ | RIGHTS
+ | INSTITUTION
+ | CONTACT
+ | FIRSTVERSION
+ | MODIFIED
+
+<pattern> := <"-quoted-constant-string> (* pattern costante *)
+<reference> := <'-quoted-constant-string> (* riferimento costante *)
+
+<rvar> := <not-reserved-identifier> (* variabile per riferimenti *)
+<svar> := $ <not-reserved-identifier> (* variabile per stringhe *)
+<lvar> := % <not-reserved-identifier> (* variabile per liste *)
+
+
+- le stringhe sono "case sensitive"
+- la funzione non definita sull'argomento restituisce la stringa nulla
+- le <rvar> si presuppongono essere istanziate come URI references costituite
+ da un URI e da un fragment identifier opzionale complete; i riferimenti
+ identificano risorse
+- ogni binding lega una variabile libera (nomi nuovi)
+- Precedenza operatori:
+ NOT (+) DIFF
+ AND INTERSECT
+ OR (-) UNION
+- L'ordinamento di default e' quello alfabetico crescente in base al nome
+ delle rvar
+- REFERENCE aumenta performance perche' NON accede al data base (costoso).
+- Note su <pattern>
+ Contiene un'espressione regolare per selezionare delle "reference"
+ (cioe` delle uri eventualmente seguite da un fragment identifier)
+ L'espressione regolare contiene i seguenti costrutti:
+
+ costrutto semanticamente fa match con
+ ? un singolo carattere diverso da / # :
+ * la piu' lunga sottostringa che non contiene / # :
+ ** la piu' lunga sottostringa che non contiene # :
+ altro carattere solo se' stesso
+
+ costrutto puo' appareire in
+ ? "body"
+ * dovunque
+ ** "body" e "fragment"
+ altro carattere dovunque
+
+ "body" parte compresa fra le occorrenze di ":/" e "#1" escluse
+ "fragment" parte successiva all'occorrenza "#1"
\ No newline at end of file
<query> := <list> (* clausola iniziale *)
-<list> := ( <list> ) (* parentesizazione *)
+<list> := <empty-string> (* lista vuota *)
+ | ( <list> ) (* parentesizazione *)
| <rvar> (* lista singoletto var
(lista valori) *)
| <lvar> (* lista singoletto var
(lista valori) *)
- | REFERENCE <reference> (* oggetto referenziato da
- pattern costante *)
+ | REFERENCE <reference> (* oggetto referenziato da URI
+ esplicita *)
| PATTERN <pattern> (* espansione del pattern *)
| SELECT <rvar> IN <list> WHERE <bool> (* selezione *)
- | EXISTS <rvar> IN <list> WHERE <bool> (* esistenziale *)
| LET <lvar> BE <list> IN <list> (* assegnazione a var in
contesto *)
| USE <list> POSITION <svar> (* unione lista backward *)
| <list> UNION <list> (* unione *)
| <list> INTERSECT <list> (* intersezione *)
| <list> DIFF <list> (* differenza *)
+ | MINIMIZE <list> (* minimizzazione del numero
+ elementi della lista *)
+ | <list> SORTEDBY <function> <order> (* unione lista ordinata secondo
+ valore funzione e ordine *)
+<order>:= DESC (* ordinamento decrescente *)
+ | ASC (* ordinamento crescente *)
<bool> := ( <bool> ) (* parentesizzazione *)
| TRUE (* vero *)
| <string> IS <string> (* case sensitive matching *)
| <list> SETEQUAL <list> (* uguaglianza tra liste *)
| <list> SUBSET <list> (* operazione di sottoinsieme *)
+ | EXISTS <rvar> IN <list> (* esistenziale *)
<string> := <'-quoted-constant-string> (* costante letterale *)
| MAINHYPOTHESIS | HYPOTHESIS (* costanti simboliche *)
<svar> := $ <not-reserved-identifier> (* variabile per stringhe *)
<lvar> := % <not-reserved-identifier> (* variabile per liste *)
-- () = lista vuota (?)
+- query vuota e' caso patologico: non si puo' verificare
- le stringhe sono "case sensitive"
- la funzione non definita sull'argomento restituisce la stringa nulla
- le <rvar> si presuppongono essere istanziate come URI references costituite
da un URI e da un fragment identifier opzionale complete; i riferimenti
identificano risorse
-- ogni binding lega una variabile libera (nuova)
+- ogni binding lega una variabile libera (nomi nuovi)
- Precedenza operatori:
NOT (+) DIFF
AND INTERSECT
teorema ci sono?
- L'ordinamento di default e' quello alfabetico crescente in base al nome
delle rvar
+- REFERENCE aumenta performance perche' NON accede al data base (costoso).
- Note su <pattern>
Contiene un'espressione regolare per selezionare delle "reference"
(cioe` delle uri eventualmente seguite da un fragment identifier)
"body" parte compresa fra le occorrenze di ":/" e "#1" escluse
"fragment" parte successiva all'occorrenza "#1"
-- FUTURO: operatore di ordinamento sul risultato finale della query.
- <query> SORTEDBY <order> <function> (* unione lista ordinata secondo
- ordine e valore funzione *)
- <order> := DESC (* ordinamento decrescente *)
- | ASC (* ordinamento crescente *)
- DTD:
- <!ENTITY % order '(ascendant|descendant)'>
- <!ELEMENT Query %queryexpr;>
- <!ELEMENT SortBy (Query, SortField)>
- <!ELEMENT SortField %functexpr;>
- <!ATTLIST SortField
- order %order; #IMPLIED>
+- Condizioni associate alla var dell'esisteziale possono essere espresse
+ nella clausola WHERE di un SELECT nell'argomento <list> dell'EXISTS.
- RILASSAMENTO degli operatori UNION e INTERSECT. Operatori fuzzy con
introduzione di pesi associati ai risultati.
- VALUEOF restituisce il valore o, ricorsivamente sulla struttura, i valori
(delle proprieta' delle classi di valori) della proprieta' passatagli.
Problema: e' necessario gestire sia i nomi delle classi (costrutti TYPEOF)
sia i nomi delle proprieta' (menu a tendina di suggerimenti all'utente in
- base agli Schemi RDF relativi ai dati).
\ No newline at end of file
+ base agli Schemi RDF relativi ai dati).
+- L'algoritmo che implementa MINIMIZE puo' ad esempio eliminare le entrate
+ URI+insieme_di_attributi duplicate oppure le entrate con URI ripetute
+ accorpando i diversi insieme_di_attributi per l'URI in un unica entrata
+ della lista.
+
\ No newline at end of file
<!-- MathQL. -->
<!-- Operators are unambiguous (binary or unary), so there isn't any -->
<!-- grouping operator. -->
+<!-- SORTBY operator for sorting query results. -->
<!-- CONST is the constant string; rvar is for references and lvar -->
<!-- for list. -->
<!-- The attributes binder, rvar, lvar declare variables which are -->
<!-- PROPERTY works on a specified RDF property returning its value. -->
<!--*****************************************************************-->
+<!ENTITY % order '(ascendant|descendant)'>
+
<!ENTITY % position '(MainHypothesis|Hypothesis|MainConclusion|Conclusion|
Body)'>
<!-- MathQL list expression declaration -->
-<!ENTITY % listexpr '(Rvar|Lvar|Reference|Pattern|Select|Exists|LetIn|
+<!ENTITY % listexpr '(Rvar|Lvar|Reference|Pattern|Select|LetIn|SortBy|
Use|UsedBy|ConstructorsOf|InTheory|TheoryRefTo|
- TypeOf|SuperTypeOf|SubTypeOf|Union|Intersect|Diff)'>
+ TypeOf|SuperTypeOf|SubTypeOf|Union|Intersect|Diff|
+ Minimize)'>
<!-- MathQL boolean expression declaration -->
-<!ENTITY % boolexpr '(BOOL|NOT|AND|OR|IS|SETEQUAL|SUBSET)'>
+<!ENTITY % boolexpr '(BOOL|NOT|AND|OR|IS|SETEQUAL|SUBSET|EXISTS)'>
<!-- MathQL string expression declaration -->
<!ELEMENT Select (In, Where)>
-<!ELEMENT Exists (In, Where)>
-
<!ELEMENT LetIn (%listexpr;, Target)>
<!ELEMENT Use (%listexpr;, Position)>
<!ELEMENT Diff (%listexpr;, %listexpr;)>
+<!ELEMENT SortBy (%listexpr;, SortField)>
+
+<!ELEMENT Minimize %listexpr;>
+
<!-- MathQL list sub-expressions -->
<!ELEMENT RPrefix (CONST)>
<!ATTLIST ItemType
binder CDATA #REQUIRED>
+<!ELEMENT SortField %functexpr;>
+<!ATTLIST SortField
+ order %order; #IMPLIED>
+
<!-- MathQL boolean expressions -->
<!ELEMENT BOOL EMPTY>
<!ELEMENT SUBSET (%listexpr;, %listexpr;)>
+<!ELEMENT EXISTS (RVAR, %listexpr;)>
+
<!-- MathQL string expressions -->
<!ELEMENT CONST (#PCDATA)>