Ricerca in Ghini

Ricerca permette di visualizzare, esplorare e creare rapporti dai dati. È possibile eseguire ricerche inserendo le query nella voce di ricerca principale o utilizzando il generatore di Query per creare le query per voi. I risultati delle ricerche di Ghini sono elencati nella finestra principale.

Strategie di ricerca

Ghini offre quattro strategie di ricerca distinte:

  • per valore — in tutti i domini;
  • per espressione — in alcuni campi impliciti in un dominio esplicito;
  • per query — in un dominio;
  • di nome binomiale — cerca solo nel dominio di Species.

Tutte le strategie di ricerca —ad eccezione di ‘ricerca nome binomiale’— non fanno distinzione tra maiuscole e minuscole.

Ricerca per valore

Ricerca per valore è il modo più semplice per la ricerca. Immettere una o più stringhe e vedere che cosa corrisponde. Il risultato include oggetti di qualsiasi tipo (dominio), dove uno o più dei relativi campi contengono uno o più delle stringhe di ricerca.

Non si specifica il dominio di ricerca, tutti sono inclusi, né è necessario indicare quali campi si desidera far corrispondere, questo è implicito nel dominio di ricerca.

Nella tabella seguente consente di comprendere i risultati e vi guida nel formulare le ricerche.

Panoramica sui domini di ricerca
nome ed abbreviazioni campo tipo di risultato
family, fam epithet (family) Family
genus, gen epithet (genus) Genus
species, sp epithet (sp) × Species
vernacular, common, vern name Species
geography, geo name Geography
accession, acc code Accession
planting, plant code × Plant
location, loc code, name Location
contact, person, org, source name Contact
collection, col, coll locale Collection
tag, tags name Tag

Esempi di ricerca per valore sarebbe: Maxillaria, Acanth, 2008.1234, 2003.2.1, indica.

A meno di non includere fra virgolette, gli spazi separano le stringhe di ricerca. Per esempio se si cerca Block 10, Ghini cerca le due stringhe blocco e 10 e restituisce tutti i risultati che corrispondono a una di queste due voci. Se si desidera cercare Block 10 come una stringa intera basterà usare le virgolette, così: "Block 10".

× Chiavi primarie composte

Un epiteto di specie significa poco senza il genere corrispondente, allo stesso modo un codice di planting è univoco solo nell’ambito dell’accessione a cui appartiene. Nella terminologia della teoria dei database, epiteto e codice non sono sufficienti per formare un chiave primaria per rispettivamente specie e le planting. Questi domini necessitano di una chiave primaria composta.

Ricerca per valore consente di cercare planting dal loro codice planting completo, che include il codice di accessione. Presi insieme, il codice di accessione e la piantatura del codice forniscono uns chiave primaria composito per gli planting. Per specie, abbiamo introdotto la ricerca binomiale, descritta di seguito.

Ricerca per espressione

Ricerca per espressione vi dà un po” più controllo su ciò che stai cercando. Permette di restringere la ricerca ad un dominio specifico, il software definisce i campi per la ricerca all’interno del dominio indicato.

Un’espressione è costruita come <domain> <operator> <value>. Ad esempio la ricerca: gen = Maxillaria restituisce tutti i generi che corrispondono al nome Maxillaria. In questo caso il dominio è gen, l’operatore è = e il valore è Maxillaria.

La tabella Panoramica sui domini di ricerca poco sopra ti indica i nomi dei domini di ricerca, e, per ogni dominio di ricerca, quali campi vengono inclusi implicitamente nelle ricerche.

La stringa di ricerca loc like blocco% restituisce tutte le collocazioni il cui nome o codice inizia con «blocco». In questo caso il dominio è loc (un’abbreviazione per location), l’operatore è like (questo viene dall’SQL ed aggiunge un fattore di approssimazione nella ricerca), il valore è blocco%, i campi di ricerca sono implicitamente nome e codice. Il segno di percentuale viene utilizzato come jolly, pertanto se si cerca max% ricercherà tutti i valori che iniziano con «max». Se si cerca %10 ricerca per tutti i valori che terminano in 10. La stringa %ck%10 indica la ricerca di tutto ciò che contenga ck e termini in 10.

Quando una query richiede molto tempo per completare

Si dà una query, ci vuole davvero tempo per calcolare il risultato e questo contiene una quantità irragionevolmente di voci. Questo accade quando si intende utilizzare una strategia, ma le stringhe inserite non formano un’espressione valida. In questo caso Ghini ricorre al caso ricerca per valore. Ad esempio, la stringa di ricerca gen lik maxillaria cercherà le stringhe gen, lik e maxillaria, restituendo tutto ciò che soddisfi almeno uno dei tre criteri.

Ricerca per Query

Le query consentono il massimo controllo su ricerca. Con le query è possibile cercare attraverso relazioni, colonne specifiche, combinare i criteri di ricerca utilizzando gli operatori booleani come and, or, not (e loro rispettiva abbreviazioni &&, ||, !).

Se volete maggiori informazioni, o volontariare per documentare questo più a fondo, si prega di contattare gli autori. Nel frattempo si può iniziare a familiarizzare con la struttura di base del database di Ghini.

_images/ghini-10.svg

struttura di database di Ghini

Alcuni esempi:

  • piante della famiglia delle Fabaceae in posizione Blocco 10:

    plant WHERE accession.species.genus.family.epithet=Fabaceae AND location.description="Block 10"
    
  • posizioni che non contengono piante:

    location WHERE plants = Empty
    
  • accessioni associate ad una specie dal nome binomiale noto (es.: Mangifera indica):

    accession WHERE species.genus.epithet=Mangifera AND species.epithet=indica
    
  • accessioni propagate nell’anno 2016:

    accession WHERE plants.propagations._created BETWEEN |datetime|2016,1,1| AND |datetime|2017,1,1|
    
  • accessioni modificate negli ultimi tre giorni:

    accession WHERE _last_updated>|datetime|-3|
    

Ricerca per query richiede qualche conoscenza della sintassi ed un’idea della estesa struttura del database Ghini. Entrambe si acquisiscono con la pratica e magari con l’aiuto del Generatore di Query.

Generatore di Query

Ghini offre un generatore di Query, una interfaccia grafica che aiuta a costruire query di ricerca anche complesse. Per aprire il Generatore di Query fare clic sull’icona querybuilder a sinistra della voce di ricerca o selezionare Strumenti‣Query Builder dal menu.

Una finestra apparirà, che vi guiderà attraverso tutti i passaggi necessari per creare una query corretta che sarà compresa dalla strategia di Ricerca per Query di Ghini.

_images/qb-choose_domain.png
_images/qb-choose_property.png

Prima di tutto si indica il dominio di ricerca, questo vi permetterà il generatore di Query completa la sua interfaccia grafica, quindi si aggiunge il numero di clausole logico necessario, collegandoli con operatore binario and o or.

Ogni clausola è formata da tre parti: una proprietà che può essere raggiunto dal dominio di ricerca iniziale, un operatore di confronto che si seleziona dall’elenco a discesa, un valore che è possibile digitare o selezionare dall’elenco di valori validi per il campo.

Aggiungere altrettante proprietà di ricerca quante necessarie, facendo clic sul segno più. Selezionare and / or al lato dal nome della proprietà, per scegliere come combinare le clausole nella query.

Quando si è finito di costruire la query fare clic su OK per eseguire la ricerca.

A questo punto il generatore di Query scrive la query nella voce Cerca e lo esegue. Adesso si può editare la stringa come fosse stata inserita manualmente. Si noti come i valori alla sinistra vengono interpretati dal generatore di query e racchiusi tra virgolette singole se riconosciuto come stringhe, o lasciati senza virgolette se sono numeri o i due riservati parole None e Empty. Si può modificare la query e inserire virgolette se necessario, ad esempio se avete bisogno di cercare letteralmente la stringa Empty.

None è il valore di un campo vuoto. Non è la stessa che la stringa di lunghezza zero '' né il numero 0 né il booleano False né l’insieme Empty: None indica che al campo non è associato alcun valore.

Empty is the empty set. Being it a set, it can be matched against sets (eg: plants of an accession, or accessions of a species), not against elements (eg: quantity of a plant or description of a location). However, the Query Builder does not let you choose a left hand side value stopping at a set, it expects you to select a field. Choose just any field: at the moment of producing the query, when the Query Builder meets a clause with right hand side value the literal string Empty, it will drop the field name and let you compare the set on the left with Empty on the right.

We have no literals False and True. These are typed values, and the Query Builder does not know how to produce them. Instead of False type 0, and instead of True type 1.

Grammatica delle Query

Per coloro che non temono un po” di precisione formale, il codice BNF seguente vi dà un’idea piuttosto precisa della grammatica implementata dalla strategia di Ricerca per Query. Alcune categorie grammaticali sono informalmente definite; alcune mancano e sono lasciate alla vostra fertile immaginazione; i valori letterali sono inclusi tra virgolette singole; la grammatica non fa differenza tra maiuscole e minuscole, se non diversamente indicato:

query ::= domain 'WHERE' expression

domain ::= #( one of our search domains )
expression ::= signed_clause
             | signed_clause 'AND' expression
             | signed_clause 'OR' expression
             ;
signed_clause ::= clause
                | 'NOT' clause  #( not available in Query Builder)
                ;
clause ::= field_name binop value  #( available in Query Builder)
         | field_name set_binop value_list
         | aggregated binop value
         | field_name 'BETWEEN' value 'AND' value
         | '(' expression ')'
         ;
field_name ::= #( path to reach a database field or connected table )
aggregated ::= aggregating_func '(' field_name ')'
aggregating_func ::= 'SUM'
                   | 'MIN'
                   | 'MAX'
                   | 'COUNT'
                   ;
value ::= typed_value
        | numeric_value
        | none_token
        | empty_token
        | string_value
        ;
typed_value ::= '|' type_name '|' value_list '|'
numeric_value ::== #( just a number )
none_token ::= 'None'    #( case sensitive )
empty_token ::= 'Empty'  #( case sensitive )
string_value = quoted_string | unquoted_string

type_name ::= 'datetime' | 'bool' ;  #( only ones for the time being )
quoted_string ::= '"' unquoted_string '"'
unquoted_string ::=  #( alphanumeric and more )

value_list ::= value ',' value_list
             | value
             ;
binop ::= '='
        | '=='
        | '!='
        | '<>'
        | '<'
        | '<='
        | '>'
        | '>='
        | 'LIKE'
        | 'CONTAINS'
        ;
set_binop ::= 'IN'

Si prega di essere consapevoli del fatto che il linguaggio di Query di Ghini è più complesso di quello descritto dal Generatore di Query: le query costruibili con il Generatore di Query costituiscono un sottoinsieme proprio delle query riconosciute dal software:

query ::= domain 'WHERE' expression

domain ::= #( one of our search domains )
expression ::= clause
             | clause 'AND' expression
             | clause 'OR' expression
             ;
clause ::= field_name binop value
         ;
field_name ::= #( path to reach a database field or connected table )
value ::= numeric_value
        | string_value
        ;
numeric_value ::== #( just a number )
string_value = quoted_string | unquoted_string ;

quoted_string ::= '"' unquoted_string '"'
unquoted_string ::=  #( alphanumeric and more )

binop ::= '='
        | '=='
        | '!='
        | '<>'
        | '<'
        | '<='
        | '>'
        | '>='
        | 'LIKE'
        | 'CONTAINS'
        ;