Skip to main content
ALTWORX Dokumentace
Přepnout tmavý/světlý/automatický režim Přepnout tmavý/světlý/automatický režim Přepnout tmavý/světlý/automatický režim Zpět na domovskou stránku

Klauzule WHERE

Výběr aktiv pouze podle jejich ID masek není dostačující. Často se stává, že je potřeba filtrovat aktiva podle jejich vlastností/atributů. Někdy nemusíte znát přesně ID masku aktiva. Filtrování podle atributů a dalších vlastností lze provést klauzulí WHERE.

Použití klauzule WHERE v dotazech

V dotazu nejprve definujte výchozí místo dotazu ID maskou. V případě, že chcete definovat podmínku, která musí být pro hledaná aktiva splněna, použijte na následujícím místě klauzuli WHERE. Uvádí se před klauzuli SELECT (pokud je v dotazu použita). Název atributů by měl být zabalen do dvojitých uvozovek, i když někdy je lze vynechat. Řetězcové hodnoty musí být zabaleny do jednoduchých uvozovek. Jiné typy hodnot žádné uvozovky nevyžadují.

Za klauzulí WHERE lze používat následující operátory: =, <, >, <=, >=, !=, <>, IS, IS NOTa IN,

kde = je totožný s IS

a != je identický s IS NOT a <>.

Upozornění
Řetězec není považován za seřaditelný typ, takže na atributy řetězců lze použít pouze operátory rovnosti.

Jednotlivé výrazy mohou být spojeny s AND, OR nebo modifikovány s NOT.

Upozornění
Dejte pozor na to, že při směšování AND a OR mohou být vyžadovány závorky.
FROM '/assets/*' WHERE "name" = 'Server x05'

Podobně jako klauzule SELECT, WHERE je také specifická pro každý krok, proto pokud by podmínky měly platit v celém dotazu, je třeba je v každém kroku opakovat.

FROM '/assets/*' WHERE secure = true DIRECT FORWARD WHERE secure = true

WHERE v “nepočátečních” krocích

Klauzule WHERE použitá v jiném než počátečním kroku má také možnost omezit hrany, kterými se krok řídí. Místo názvu atributu lze použít EDGE TYPE nebo TO ID. Výraz může stále obsahovat omezení vlastností a všechna zadání vlastností mohou být kombinována s AND a OR, jak je zvykem.

FROM '/assets/users/*' DIRECT FORWARD WHERE EDGE TYPE IS 'owns'
FROM '/assets/users/*' DIRECT ALL WHERE TO ID LIKE '/assets/sensors/*' AND (EDGE TYPE IS 'measures' OR secret = true)

IN operator

Operátor IN poskytuje stručný způsob kontroly nad tím, že atribut má některou ze zadaných hodnot. Seznam hodnot je zabalen do kulatých závorek (). Hodnoty jsou mezi sebou odděleny čárkou ,. Každá hodnota musí být naformátovaná dle obecných pravidel.

FROM '/assets/*' WHERE specification.id = 'x05' OR specification.id = 'crc44' OR specification.id = '545'    
FROM '/assets/*' WHERE specification.id IN ('x05', 'crc44', '545')
FROM '/assets/*' DIRECT ALL WHERE EDGE TYPE = 'owns' OR EDGE TYPE = 'monitors' OR EDGE TYPE = 'manages'
FROM '/assets/*' DIRECT ALL WHERE EDGE TYPE IN ('owns', 'monitors', 'manages')

Filtrování podle vztahů

Chcete-li filtrovat aktiva podle jejich vztahů, můžete tyto vztahy rovněž definovat v krocích AQL. Například pro seznam všech uživatelů připojených k jakémukoli incidentu můžete použít TO ID LIKE, viz dotaz:

SKIP '/incident/*' DIRECT BACKWARD WHERE TO ID LIKE '/assets/users/*'

I když se jedná o preferovaný způsob, vznikají situace, kdy vede až k příliš složitým dotazům.

Pro složitější dotazy nebo tam, kde byste jindy použili podmínku, můžete použít klauzuli EDGE COUNT. Zadaný počet omezuje aktiva existencí (nebo neexistencí) určitých hran. Můžete zadat přesný počet hran, které aktivum musí nebo nesmí mít.

Výše uvedený příklad lze přepsat takto:

FROM '/assets/users/*' WHERE EDGE COUNT TO '/incident/*' > 0

Všimněte si, dotaz je mnohem přímočařejší, chcete znát uživatele a přímo se na ně ptáte. Omezení je také zjevnější, protože dělá přesně to, co říká, omezuje uživatele na ty, které mají alespoň jednu hranu spojenou s incidentem.

Směr hrany je určen pomocí TO, která uvádí, že by měly být započítány pouze odchozí hrany. Podobně můžete použít FROM pro příchozí hrany a TO OR FROM pro libovolnou hranu bez ohledu na její směr. Pokud není cílové aktivum důležité, můžete použít ANY. Takže pokud použijete TO OR FROM ANY, pak bude započítána jakákoliv hrana bez ohledu na její směr a cíl.

Typ hrany může být také omezen, stačí přidat VIA '{type}' do klíčového slova pro směr, například EDGE COUNT VIA 'owns' TO ANY bude počítat odchozí hrany typu ‘owns’. Je-li VIA vynecháno, jako ve výše uvedených příkladech, typ hrany nebude omezen.

Můžete také omezit vztahy, které se klenou přes více hran, stačí opakovat VIA a TO/FROM vícekrát.

Příklady dotazů s použitím WHERE

Aktiva, která mají konkrétní název a velikost (vrací samotná aktiva a atribut názvu a velikosti).

FROM '/assets/*' WHERE "name" = 'Server x05' AND size > 305 SELECT ["name", "size"]

Aktiva, která hoří (on fire = true) nebo které mají uvedenu teplotu a kritický faktor nad velmi rizikové hodnoty:

FROM '/assets/*' WHERE "on fire" = true OR (temperature > 95 AND "critical_factor" > 2) OR (temperature > 60 AND "critical_factor" >= 5)

Uživatelé, pro které neexistuje cesta user -> incident -> room X:

FROM '/users/*' WHERE EDGE COUNT TO '/incident/*' TO '/rooms/X'  = 0

Incidenty, které nemají žádné uživatele propojené jako aktéry:

FROM '/incident/*' WHERE EDGE COUNT VIA 'actor' FROM '/assets/users/*' = 0

Uživatelé pracující v budově X, kteří současně nejsou řízeni uživatelem Y.

FROM '/users/*' WHERE EDGE COUNT VIA 'works in' TO '/buildings/X' > 0 AND EDGE COUNT VIA 'manages' FROM '/users/Y' = 0