Condividi tramite


Operatori logici OData in Ricerca di intelligenza artificiale di Azure - and, or, not

Le espressioni di filtro OData in Ricerca di intelligenza artificiale di Azure sono espressioni booleane che restituiscono true o false. È possibile scrivere un filtro complesso scrivendo una serie di filtri più semplici e componendoli usando gli operatori logici dell'algebra booleana:

  • and: operatore binario che restituisce true se le espressioni secondarie a sinistra e destra restituiscono true.
  • or: operatore binario che restituisce true se una delle relative espressioni secondarie sinistra o destra restituisce true.
  • not: operatore unario che restituisce true se la sottoespressione restituisce falsee viceversa.

Questi, insieme agli operatori any di raccolta e all, consentono di costruire filtri che possono esprimere criteri di ricerca molto complessi.

Sintassi

Il seguente EBNF (Extended Backus-Naur Form) definisce la grammatica di un'espressione OData che usa gli operatori logici.

logical_expression ::=
    boolean_expression ('and' | 'or') boolean_expression
    | 'not' boolean_expression

È disponibile anche un diagramma di sintassi interattivo:

Esistono due forme di espressioni logiche: binary (and/or), dove sono presenti due espressioni secondarie e unarie (not), dove ne esiste una sola. Le espressioni secondarie possono essere espressioni booleane di qualsiasi tipo:

  • Campi o variabili di intervallo di tipo Edm.Boolean
  • Funzioni che restituiscono valori di tipo Edm.Boolean, ad esempio geo.intersects o search.ismatch
  • Espressioni di confronto, ad esempio rating gt 4
  • Espressioni di raccolta, ad esempio Rooms/any(room: room/Type eq 'Deluxe Room')
  • Valori letterali booleani true o false.
  • Altre espressioni logiche costruite usando and, ore not.

Importante

Esistono alcune situazioni in cui non tutti i tipi di sottoespressione possono essere usati con and/or, in particolare all'interno di espressioni lambda. Per informazioni dettagliate, vedere Operatori di raccolta OData in Ricerca di intelligenza artificiale di Azure.

Operatori logici e null

La maggior parte delle espressioni booleane, ad esempio funzioni e confronti, non può produrre null valori e gli operatori logici non possono essere applicati direttamente al null valore letterale( ad esempio, x and null non è consentito). Tuttavia, i campi booleani possono essere null, quindi è necessario essere consapevoli del comportamento degli andoperatori , ore not in presenza di null. Questo riepilogo è riportato nella tabella seguente, dove b è un campo di tipo Edm.Boolean:

Espressione Risultato quando b è null
b false
not b true
b eq true false
b eq false false
b eq null true
b ne true true
b ne false true
b ne null false
b and true false
b and false false
b or true true
b or false false

Quando un campo b booleano viene visualizzato da solo in un'espressione di filtro, si comporta come se fosse stato scritto b eq true, quindi se b è null, l'espressione restituisce false. Analogamente, not b si comporta come not (b eq true), quindi restituisce true. In questo modo, null i campi si comportano come false. Questo comportamento è coerente con il comportamento in combinazione con altre espressioni usando and e or, come illustrato nella tabella precedente. Nonostante ciò, un confronto diretto con false (b eq false) restituirà falsecomunque . In altre parole, null non è uguale a false, anche se si comporta come in espressioni booleane.

Esempi

Trova la corrispondenza tra i documenti in cui il rating campo è compreso tra 3 e 5, inclusi:

    rating ge 3 and rating le 5

Trova la corrispondenza con i documenti in cui tutti gli elementi del ratings campo sono minori di 3 o maggiori di 5:

    ratings/all(r: r lt 3 or r gt 5)

Trova la corrispondenza con i documenti in cui il location campo si trova all'interno del poligono specificato e il documento non contiene il termine "public".

    geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))') and not search.ismatch('public')

Trova i documenti per gli hotel a Vancouver, Canada, dove c'è una camera deluxe con una tariffa di base inferiore a 160:

    Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)

Passaggi successivi