# Operatory logiczne
Podczas tworzenia scenariuszy zapytania użytkownik określa różne warunki, które mają zostać spełnione przez wyszukane wyniki. Warunki te mogą zostać połączone ze sobą poprzez spójnik logiczny „ORAZ" albo spójnik „LUB". Ponadto spójniki mogą zostać poprzedzone zaprzeczeniem „NIE". Złożone zdania logiczne, w których występują różne spójniki, wymagają zastosowania odpowiednich nawiasów, których umiejscowienie zmienia sens całego zdania. Aby utrzymać maksymalną prostotę i intuicyjność obsługi interfejsu, budowanie zapytań skomplikowanych pod względem logicznym zostało rozłożone na kolejne kroki. Dzięki temu użytkownik nie musi się obawiać pomyłki w umiejscowieniu nawiasów w zdaniu logicznym. Użytkownikom czującym się niepewnie w logice matematycznej polecamy zapoznać się z poniższymi wyjaśnieniami.
# Niezbędne podstawy logiki matematycznej
# Spójnik „ORAZ" (Koniunkcja)
Warunki połączone spójnikiem „ORAZ" muszą być spełnione jednocześnie - wybierając w danych pacjenta warunki „kobieta", „poniżej 60 lat" i „powyżej 40 lat" połączone spójnikiem „ORAZ" wyszukamy pacjentki w wieku 41-59 lat. Wybierając zdarzenia medyczne, np. procedura A, badanie B i rozpoznanie C wyszukamy tylko pacjentów, którzy w swojej historii mają wszystkie trzy zdarzenia. Należy zwrócić uwagę, czy warunki połączone spójnikiem „ORAZ" nie są sprzeczne, ponieważ w wyniku otrzymamy zbiór pusty. Taki błąd najłatwiej popełnić przy definiowaniu przedziałów czasowych lub wieku pacjenta - wyszukanie pacjentów starszych niż 60 lat i młodszych niż 50 lat da w wyniku zbiór pusty.
# Spójnik „LUB" (Alternatywa)
Jeżeli kilka warunków połączymy spójnikami „LUB", spełniony musi być co najmniej jeden z nich (ale mogą być też spełnione wszystkie) - wyszukanie pacjentów z rozpoznaniem A lub B lub C poskutkuje znalezieniem pacjentów, którzy w swojej historii posiadają jedno z tych rozpoznań, dowolne dwa z nich lub wszystkie trzy naraz. Omyłkowe użycie spójnika „LUB" zamiast planowanego „ORAZ" może poskutkować wyszukaniem wszystkich pacjentów. Jeśli w wyszukiwaniu pacjentów w wieku powyżej 40 lat ORAZ poniżej 60 lat omyłkowo użyjemy spójnika „LUB", zamiast grupy pacjentów w wieku 41-59 lat wyszukamy po prostu wszystkich - każdy człowiek jest młodszy niż 60 lat lub starszy niż 40 (a spora grupa ludzi spełnia obydwa te warunki jednocześnie).
# Operator „NIE" (Zaprzeczenie)
Tak samo jak w mowie potocznej, zaprzeczenie „NIE" odwraca sens zdania logicznego. Pacjenci, którzy NIE są w wieku powyżej 60 lat, są w wieku 60 lat lub mniej. Zaprzeczenie „NIE" może wystąpić również w bardziej złożonych zdaniach logicznych, np. A ORAZ NIE B, np. złamanie kończyny dolnej ORAZ NIE operacja kończyny dolnej - pacjenci, którzy mieli złamaną kończynę dolną, ale złamanie nie wymagało zabiegu operacyjnego.
Jedyne twierdzenia logiki matematycznej, jakie mogą się przydać podczas tworzenia zapytań to:
# Prawa De Morgana
Pierwsze prawo De Morgana dotyczy zaprzeczania koniunkcji:
NIE (A ORAZ B) = NIE A LUB NIE B
Przykład: pacjenci, którzy nie mieli jednocześnie złamanej kończyny górnej oraz dolnej to tacy, którzy albo nie mieli złamanej kończyny górnej, albo nie mieli złamanej kończyny dolnej, czyli ci, którzy mieli złamaną tylko kończynę dolną, tylko górną oraz ci, którzy nie mieli złamanej żadnej kończyny.
Drugie prawo De Morgana dotyczy zaprzeczania alternatywy:
NIE (A LUB B) = NIE A ORAZ NIE B
Przykład: pacjenci, którzy nie mają nadciśnienia lub miażdżycy to pacjenci, którzy nie mają ani nadciśnienia, ani miażdżycy.
# Logika budowania zapytań
# Łączenie kroków
Scenariusz wyszukiwania jest tworzony krokowo. Domyślnie każdy krok jest łączony z poprzednimi za pomocą spójnika „ORAZ", tzn. zdefiniowanie w kroku pierwszym rozpoznania „złamanie kończyny dolnej", w kroku drugim procedury „tomografia kończyny dolnej" i w kroku trzecim płci pacjenta „mężczyzna" poskutkuje wyszukaniem pacjentów, którzy spełniają jednocześnie wszystkie trzy warunki, a więc mężczyzn ze złamaną kończyną dolną, którym wykonano tomografię kończyny dolnej.
Łączenie kroków spójnikiem „LUB" nie jest możliwe. Jeżeli chcemy zrealizować zapytanie, które wymagałoby takiego podejścia, np. wyszukanie mężczyzn ze złamaniem kończyny dolnej lub takich, którym wykonano tomografię, należy wykonać dwa oddzielne scenariusze (1. mężczyźni ze złamaniem, 2. mężczyźni z tomografią), pobrać pliki wynikowe każdego z wyszukiwań, a następnie w programie zewnętrznym połączyć odpowiednie kolumny. Należy mieć wówczas na uwadze, że nie wszystkie kolumny w tych plikach będą się powtarzać - w pliku pierwszym wystąpi np. kolumna z datą złamania, a w drugim - z datą tomografii.
# Łączenie kafelków
Wewnątrz jednego kroku ustalamy wszystkie szczegóły dotyczące jednego zdarzenia medycznego: procedury, rozpoznania czy podania leku. Każdy fakt dotyczący tego zdarzenia wyświetlany jest na osobnym kafelku. Wszystkie te kafelki domyślnie połączone są ze sobą spójnikiem „ORAZ"- możliwe jest na przykład wyszukanie podania leku o nazwie międzynarodowej „Morphini" i drodze podania „Dożylnie" i wieku pacjenta w momencie podania leku równym 60 lat. Fakt połączenia kafelków spójnikiem „ORAZ" przejawia się w lewym górnym rogu każdego kafelka. Kliknięcie w ten spójnik wywołuje listę rozwijaną, z której można wybrać zaprzeczenie „ORAZ NIE" - w ten sposób można np. wyszukać wszystkie podania morfiny, które NIE odbyły się drogą dożylną, czyli mogły się odbyć dowolną inną drogą podania. Połączenie kafelków spójnikiem „LUB" nie jest możliwe - doświadczenie pokazuje, że taki układ (np. leki, które nazywają się morfina lub podane dożylnie) nie odpowiada realnym problemom badawczym a umożliwienie łączenia kafelków spójnikiem „LUB" powodowałoby znaczne skomplikowanie obsługi programu przez konieczność definiowania nawiasów.
# Łączenie elementów wewnątrz kafelka
Wewnątrz kafelka najgłębszego poziomu (np. „Rodzaj rozpoznania" w pozycji „Rozpoznania" czy „Nazwa handlowa leku" w pozycji „Podania leków") możliwe jest wybranie dowolnej liczby wartości. Wszystkie wybrane wartości zostaną połączone spójnikiem „LUB" - możemy wyszukać pacjentów z rozpoznaniem o kodzie I50 lub I50.0 lub I50.1 lub I50.9 albo pacjentów po operacji rewizyjnej stawu biodrowego: „z wymianą panewki i kapy" lub „z wymianą panewki i protezy głowy kości udowej" lub „z wymianą elementu udowego i wkładki panewki" itd. Aby zdefiniować dwie procedury, którym obowiązkowo miał zostać poddany pacjent (czyli połączyć je spójnikiem „ORAZ") np. operacja pierwotna i operacja rewizyjna, należy zdefiniować je w dwóch osobnych krokach.
UWAGA: nie należy definiować takich procedur na dwóch osobnych kafelkach w jednym kroku! Wszystkie filtry nałożone w jednym kroku dotyczą jednego zdarzenia medycznego - takie sformułowanie oznaczałoby więc wyszukiwanie jednej procedury o nazwie „operacja pierwotna: " ORAZ „operacja rewizyjna", co poskutkowałoby brakiem wyników.
Wyjątkiem od powyższej zasady są jedynie zaawansowane operatory czasowe. Dla ułatwienia obsługi kilka warunków zostało połączonych w jeden pod przyciskiem z symbolem operatora zaawansowanego:
Po ustaleniu długości przedziału warunki wyświetlają się w kafelku w tradycyjny sposób, znany z innych kafelków, jednak specyfika warunków czasowych wymusza łączenie niektórych z nich spójnikiem „ORAZ".
Aby uniknąć pomyłek w sytuacji, gdy użytkownik chce edytować warunki czasowe, najlepszą opcją jest usunięcie całego kafelka i zdefiniowanie warunku czasowego od nowa, zamiast usuwać pojedyncze warunki z kafelka.
# Zarządzanie danymi wielokrotnymi
Podczas przeszukiwania danych medycznych nie można zapominać o fakcie, że te same zdarzenia mogą występować w historii pacjenta wielokrotnie. Najlepszym przykładem są tu podania leków oraz wyniki morfologii - jeden pacjent może mieć w swojej historii setki podań tego samego leku oraz wiele wyników morfologii. Określanie następstwa czasowego takich zdarzeń (opisane dokładnie w zakładce Operatory czasowe) jest często niewystarczające: chcąc wyszukać wynik morfologii po podaniu leku, musimy określić, który konkretnie wynik morfologii, po którym podaniu leku mamy na myśli. Obsługę danych wielokrotnych umożliwiają przyciski znajdujące się na górze każdego kafelka:
Podczas definiowania każdego kroku należy się zastanowić, czy zaznaczona jest prawidłowa opcja. Dla łatwiejszego zrozumienia znaczenia poszczególnych przycisków posłużymy się przykładem. Załóżmy, że w pierwszym kroku zdefiniowaliśmy wyszukiwanie pacjentów z rozpoznaniem złamania w obrębie kości udowej, a w drugim dodaliśmy procedurę: operację wszczepienia endoprotezy stawu biodrowego. Zakładamy dla prostoty, że każdy pacjent odbył taką operację tylko jeden raz. W kroku trzecim wyszukamy podania morfiny i omówimy dostępne opcje zarządzania danymi wielokrotnymi.
# Zwielokrotnij wynik
Pierwszy przycisk od lewej strony (z symbolem trzech poziomych linii) oznacza zwielokrotnienie wyników. O ile do tej pory jeden wiersz odpowiadał jednemu pacjentowi, tak po wybraniu opcji „zwielokrotnij wynik" plik wynikowy ulegnie reorganizacji. Wyszukane zostaną wszystkie podania morfiny, a każde z nich wyświetlone zostanie w nowym wierszu. Jeżeli więc pacjent przyjął morfinę 10 razy, jego dane zajmą teraz 10 wierszy - dane osobowe i dane dotyczące operacji powielą się, ale w każdym kolejnym wierszu pojawi się inna data podania morfiny, być może inna dawka lub droga podania. Opcja ta jest użyteczna w sytuacji, kiedy chcemy się zorientować, jakie zdarzenie medyczne występuje w badanej grupie najczęściej, np. jaki lek jest podawany najczęściej pacjentom z nadciśnieniem. Wyszukujemy wówczas w kroku pierwszym pacjentów z nadciśnieniem, a w kroku drugim wybieramy kafelek „Podania leków" bez ustalania jakichkolwiek filtrów. Wybieramy opcję zwielokrotnienia wyników, przez co podanie każdego leku wyświetli się w osobnym wierszu. Możemy wówczas przejść do modułu statystycznego i wykonać tabelę liczebności dla zmiennej „Nazwa leku".
# Pierwszy znaleziony wynik
Drugi od lewej przycisk (z symbolem strzałki skierowanej w lewo) oznacza wyszukanie pierwszego (tj. najstarszego) wyniku dla każdego pacjenta. Należy mieć na uwadze, że wyszukanie pierwszego podania morfiny może więc poskutkować znalezieniem podania, które odbyło się 10 lat przed operacją. Opcja wyszukiwania pierwszego wyniku współgra z operatorami czasowymi - możemy ustalić przedział czasowy, w jakim mają sie znaleźć podania morfiny (np. po operacji wszczepienia endoprotezy) i wyszukać pierwsze z tych podań.
# Ostatni znaleziony wynik
Przycisk z symbolem strzałki w prawo działa analogicznie jak omówiony powyżej przycisk „Pierwszy znaleziony wynik" z tą różnicą, że znajduje on wynik ostatni (czyli najnowszy). Podobnie jak wcześniej, ustalenie przedziału czasowego jako „przed zabiegiem" i wybór opcji „Ostatni znaleziony wynik" spowoduje wyszukanie ostatniego podania leku przed operacją.
# Minimalna liczba wyników
Przycisk z symbolem „większe równe" oraz polem do wprowadzania wartości liczbowej służy do określania minimalnej liczby wyników, jaka ma wystąpić u wyszukanych pacjentów. Jeżeli z jakiegoś powodu interesują nas tylko pacjenci, którzy otrzymali morfinę 5 razy lub więcej, należy wybrać ten właśnie przycisk i wpisać w polu tekstowym wartość 5. Szczególnie istotne są jednak wartości 1 i 0. Wprowadzenie wartości 1 spowoduje wyszukanie tylko tych pacjentów, którzy otrzymali morfinę co najmniej jeden raz i odrzucenie tych, którzy jej nie otrzymali. Wprowadzenie wartości 0 nie odfiltruje żadnego pacjenta (wyszukaj tych, którzy otrzymali morfinę co najmniej 0 razy - czyli wszystkich). Jako wynik otrzymamy więc tabelę tych samych pacjentów, których uzyskaliśmy w kroku poprzednim, uzupełnioną jednak o informację, ile razy każdy z nich otrzymał morfinę. Po wprowadzeniu do pola tekstowego wartości 0 pod przyciskiem pojawią się trzy małe przyciski z cyframi od 1 do 3. Służą one do tworzenia kolumn kategoryzujących. Aby dowiedzieć się więcej o tej funkcjonalności, przejdź do zakładki „Kolumny kategoryzujace"
UWAGA: po wybraniu przycisku „Minimalna liczba wyników" informacje dotyczące wszystkich podań leków jednego pacjenta zostaną przedstawione w jednej komórce tabeli wynikowej. Z tego powodu nie będzie można na nich przeprowadzać analiz statystycznych.
# Maksymalna liczba wyników
Przycisk z symbolem „mniejsze równe" oraz polem tekstowym służy do określania maksymalnej liczby wystąpień danego zdarzenia medycznego. Jeżeli chcemy wyszukać tylko tych pacjentów, którzy otrzymali morfinę 3 razy lub mniej, wpisujemy w polu tekstowym wartość 3. Przyciski „Minimalna liczba wyników" i „Maksymalna liczba wyników" mogą być aktywne jednocześnie - możemy wyszukać np. tylko tych pacjentów, którzy otrzymali morfinę 4 razy, wpisując wartość 4 w obydwu kafelkach jednocześnie. Sytuacją szczególną jest wprowadzenie w polu tekstowym wartości 0. Wyszukani zostaną wówczas tylko ci pacjenci, którzy nie przyjęli morfiny ani jeden raz. Można więc zastosować tę opcję jako formę negacji.
# Zarządzanie danymi wielokrotnymi - opcje zaawansowane
Pierwszy od prawej strony przycisk z symbolem koła zębatego uruchamia panel opcji zaawansowanych.
Użytkownik dostaje wówczas następujące możliwości:
# Zwielokrotnij wyniki bieżącego kroku lub agreguj wyniki bieżącego kroku do jednego wiersza
Na górze panelu mamy do wyboru dwie wykluczające się nawzajem opcje - zwielokrotnienie wyników (a zatem ta sama funkcjonalność, która ukryta jest w menu podręcznym pod symbolem trzech poziomych linii) lub agregacja wyników do jednego wiersza - wszystkie podania morfiny jednego pacjenta (lub z jednej hospitalizacji, w zależności od kroku pierwszego) zostaną wówczas umieszczone w jednej komórce. Po wybraniu opcji zwielokrotnienia wierszy pozostałe opcje ulegają dezaktywacji.
# Wymagania krotności
Podobnie jak w menu podręcznym, użytkownik ma możliwość ustalenia minimalnej i/lub maksymalnej liczby wystąpień danego zdarzenia medycznego w historii pacjenta.
# Sortowanie wyników
Za pomocą tej opcji użytkownik może zdecydować o kryterium sortowania wartości wewnątrz pojedynczej komórki . Komórki wielokrotne, np. zawierające wyniki wszystkich pomiarów ciśnienia skurczowego danego pacjenta są domyślnie posortowane po dacie. Wybierając z listy inną wartość, np. wynik pomiaru, użytkownik może posortować dane w komórce w inny sposób.
# Wyodrębnianie wyniku
Za pomocą tej opcji użytkownik może wykonać operację wyodrębnienia unikatowych wyników wewnątrz pojedynczej komórki (ang. distinct). Zobrazujmy to na przykładzie. Użytkownik chciałby się dowiedzieć, który pacjent podczas swojej hospitalizacji przyjmował ibuprofen, ketonal i diklofenak (lub jakąś kombinację tych trzech). W tym celu należy wyszukać podania tych trzech leków w jednym kroku. Jeżeli pacjent przyjmował wspomniane leki kilkukrotnie, komórka z wynikami może wyglądać np. tak: ibuprofen ibuprofen ketonal ibuprofen ibuprofen ketonal Jeżeli użytkownika nie interesuje, ile razy podano pacjentowi każdy z leków, może skorzystać z opcji wyodrębniania. Po zastosowaniu tego zabiegu przykładowa komórka skróci się do postaci: ibuprofen ketonal
# Ograniczenie liczby wyników
Za pomocą tej opcji użytkownik może ustalić liczbę, do jakiej zostaną ograniczone wyświetlone pozycje. O ile w opcji ustalenia maksymalnej liczby wyników, pacjenci o liczbie przewyższającej ustalony limit zostaną odfiltrowani, o tyle w opcji ograniczenia liczby wyników pacjenci z większą liczbą wyników nie zostaną usunięci z pliku wynikowego, a jedynie liczba wyświetlonych wyników dla każdego pacjenta zostanie ograniczona.