2017-02-03 12 views
6

Jestem nowy na forum i dopiero zaczynam od Neo4J. Przepraszam za moje zdyszane pytanie i podstawowe informacje, ale myślę, że pomaga to wyjaśnić, co próbuję podrobić.Modelowanie metadanych dotyczących obliczeń matematycznych w Neo4j

Często pracuję przy projektach Business Intelligence i Data Warehouse dla firm. Gdy tworzymy wymagania Business Intelligence, zwykle musimy utworzyć listę danych biznesowych, które nas interesują (takie jak przychody ze sprzedaży, stosunek zysku, całkowite wydatki) i udokumentować, w jaki sposób te dane biznesowe są obliczane z wykorzystaniem atrybutów danych z naszych systemów bazowych. Zazwyczaj dokumentujemy większość tej pracy w programie Excel w postaci arkuszy kalkulacyjnych wymagań dotyczących danych. Tworzymy listę metryk biznesowych, a następnie stos kolumn z opisem, atrybutami danych źródłowych, obliczeniami itp. Próbuję zrobić (jako osobisty projekt strony) opracować aplikację, której możemy użyć do udokumentowania tego typu informacje o metadanych. Przeczytałem kilka książek i artykułów online Neo4j i myślę, że Neo4j dobrze pasuje do tego Przypadku Używania i teraz próbuję udokumentować podstawowy model danych, aby pomóc mi zacząć.

Początkowo wymyśliłem coś dość prosto do przodu, jak pokazano na zdjęciu po lewej stronie poniżej począwszy od punktu, w którym:

Sales Przychody = Unit_Price * Count_Units_Sold

First Attempt at Modelling Metrics & Attributes

Szybko jednak zdałem sobie sprawę, że samo obliczenie jest dla mnie bardzo ważne i że w późniejszym czasie chciałabym zdobyć więcej informacji na jego temat, takich jak dodanie różnych wersji obliczanie lub dodawanie notatek w celu dalszego ich opisu. Zmodyfikowałem model, aby "samo obliczenie" było oddzielnym węzłem, jak na obrazku po lewej stronie.

Jednak, gdy zaczynam patrzeć na bardziej złożone dane, wciąż nie jestem pewien, jak najlepiej przedstawić szczegóły obliczeń. Jeśli wezmę poniższy przykład, będę go modelował w następujący sposób.

Wynagrodzenie = Salary_Amount + Overtime_Amount - Kwota podatku

More Complex Example

Teraz to jasno przedstawia atrybuty danych (3 lub ich), które są używane w obliczeniach, ale nie wiem jak do reprezentowania samych obliczeń. Na przykład. aby zdefiniować, że obliczenia są wykonywane przez dodanie Salary_Amount do Overtime_Amount, a następnie odjęcie Tax_Amount. Kiedy będę miał bardziej złożone obliczenia obejmujące dzielenie i mnożenie, które muszą być wykonane w określonej kolejności, będzie to jeszcze bardziej skomplikowane. Zasadniczo chcę być w stanie wywnioskować z modelu że obliczenia jest następujący:

Pensja = Salary_Amount + Overtime_Amount - kwota podatku

W przeciwieństwie do:

Zarobki = Salary_Amount * Kwota podatku/nadgodziny Kwota

Lub:

Wynagrodzenie = Kwota podatku * Nadgodziny Kwota - Wynagrodzenie Kwota

szukam jakiś sposób do określenia węzeł obliczeniowy czym mogę zastosować kolejność na drodze atrybuty dane są wykorzystywane. Możliwe, że powinienem zapisać kalkulację jako ciąg tekstowy we właściwości obliczeń, ale nie mogę przestać myśleć, że może to spowodować ból w drodze i ograniczyć możliwość uzyskiwania informacji o przydatności z wykresu, gdy atrybuty danych są używane w różnych obliczeniach.

Uwaga: widziałem na forum this question na podobnym temacie, ale nie otrzymałem wielu odpowiedzi, mimo że moje pytanie jest podobne, chociaż podanie dodatkowych informacji może przynieść dodatkowe informacje.

dziękuję, Michael


jestem edycji to pytanie po zapoznaniu odpowiedź autorem @ChristopheWillemsen i @ stdob--.

Po pierwsze dziękuję bardzo obu współtwórcom. Odpowiedzi i materiały referencyjne były naprawdę pomocne i obaj pokryli moje wymagania. Początkowo pochyliłem się nad wykorzystaniem odwrotnej polskiej notacji zgodnie z odpowiedzią @ stdob, ponieważ oferowało ona zgrabny sposób obsługi zgrupowanych operacji (na przykład nawiasów w moich formułach matematycznych). Jednak po próbie modelowania moich danych w obie strony stwierdziłem, że mam dodatkowe wymagania, których nie uwzględniłem w moim pierwszym poście, który ma na celu przechwycenie wyrażeń logicznych, takich jak "Jeśli, gdzie, które masz). Zasadniczo chcę być w stanie przechwytywać reguły transformacji typu ETL, które wykraczają poza czyste wyrażenia matematyczne i myślę, że to rozwiązanie przez @ChristopheWillemsen będzie to wspierać.

Oto jak mam wzorowany moich podstawowych formuł z zastosowaniem tego podejścia:

Basic Calc following Method 1

Jednak mam również bardziej złożonej logiki, który chcę modelu. Są to reguły typu ETL, które zazwyczaj są rejestrowane jako pseudo kod lub w postaci SQL podczas definiowania wymagań biznesowych dla hurtowni danych lub projektu BI. Poniżej znajduje się przykład, w którym definiuję logikę, w jaki sposób ETL może obliczyć Metrykę Nowych Roszczeń dla firmy ubezpieczeniowej.

New Claims Count Calculation

Jest to jak mam to rozszerzenie wzorowane na rozwiązaniu, które @ChristopheWillemsen dostarczonych w pierwszej odpowiedzi poniżej.

New Claims Count Modelled

mógłbyś spojrzeć na to i zobaczyć, czy jest to odpowiedni sposób modelować to. Z punktu widzenia wymagań będą Chcę być w stanie:

  • Zrekonstruować logikę tak, że mogę przedstawić go z powrotem do użytkowników końcowych
  • odpowiedzi na pytania takie jak to, które metryki atrybut jest potrzebne.
  • Przeprowadzić what-if-analizy (np jeśli wartość atrybutu zmienia jaki jest wpływ na metryki, które wykorzystują ten atrybut.

Czy to wygląda odpowiedniego podejścia do modelowania tego typu informacji? Wszelkie sugestie lub ulepszenia są mile widziane

+0

Właśnie natknąłem się na ten ciekawy artykuł: https://blog.socratic.org/stepping-into-math-open-sourcing-our-step-by-step-solver-9b5da066ae36#.sn0owu2yb –

Odpowiedz

6

jest to bardzo ciekawy przypadek wykorzystania i dla mnie to zbliża się do tego, co nazywamy Rules Silniki

Zamieściłem przypadek użycia o tym na blogu neo4j:?. https://neo4j.com/blog/uncommon-use-cases-graph-databases/

Oczywiście istnieje wiele sposobów osiągania tego, co chcesz i podzielę się jednym sposobem, jaki mam na myśli.

Będę traktował obliczenia jako uporządkowaną listę Operations, której różne charakterystyki są zdefiniowane przez ich etykietę. Na przykład, masz węzeł Operation mający dodatkową etykietę Addition, a jego następną operacją może być węzeł Operation z etykietą Substraction.

Prosty model mógłby być przedstawiony następująco:

enter image description here

Twoje Operation węzły następnie odwołać wartości przychodzące są one używane.

W bardziej skomplikowanej sytuacji, chciałbyś reprezentować grupę operacji, które mogą zdefiniował matematycznego grupowanie między nawiasami, kolejny model można zrobić tak:

enter image description here

Możliwości są niemal nieograniczone .

Należy zauważyć, że w informatyce, technika ta znana jest również jako specyfikacja Wzór: https://www.martinfowler.com/apsupp/spec.pdf

+0

Bardzo dziękuję za rozwiązanie @ChristopheWillemsen. Modelowałem moje dane w ten sposób, ale potem odkryłem, że mam dodatkowe wymagania, aby uchwycić więcej logiki na temat obliczeń. Zmieniłem moje pytanie, aby pokazać, w jaki sposób proponuję rozszerzyć Twoje rozwiązanie, aby to uwzględnić. Czy możesz rzucić okiem i zobaczyć, czy uważasz, że to odpowiednie podejście? Dzięki. – n4nite

+0

@ n4nite Brzmi nieźle. Teraz zbudowałem taki silnik reguł dla klienta na szczycie neo4j, przejście z pełnym algorytmem szyfrowania zdecydowanie nie jest właściwą drogą, więc zbudowaliśmy silnik reguł warstwy aplikacji, który obsługuje typy "ocen" i jest to dość potężne. Poszedłem również w łatwy sposób w odpowiedzi, która ma tę wadę, że reguły są ścisłe dla danych, więc można zamiast tego dodawać właściwości resolwera w swoich węzłach. Możesz wysłać mi e-mail na adres [email protected] i mogę podzielić się mini wyjaśnieniem takiej implementacji. –

4

Pierwsza opcja to napisać wyraz w Reverse Polish Notation i przechowywać je w uporządkowanej drzewa:

Salary_Amount * Tax_Amount/Overtime_Amount 
=> 
Salary_Amount Tax_Amount * Overtime_Amount/

enter image description here


druga opcja, która przychodzi do głowy: zachować formułę w postaci o f tekst i wysłać formułę i wartość parametrów w dowolnym języku skryptowym do uruchomienia. Na przykład - w javascript eval.


Polecam również przeczytać ten artykuł: Spreadsheets Are Graphs Too


UPD .: Pomysł jak używać Cypher i apoc-library obliczyć formuły:

WITH "{Salary_Amount} * {Tax_Amount}/{Overtime_Amount}" as Formula 
CALL apoc.cypher.run("return " + Formula + " as value", { 
    Salary_Amount: 1000, 
    Tax_Amount: 0.49, 
    Overtime_Amount: 100 
}) yield value as result 
RETURN result.value 
+0

Odwrotna notacja polska wygląda bardzo interesująco do grania z @ stob - dzięki za udostępnienie. –

+1

Dziękuję za wskazanie kroków militarnych, @ChristopheWillemsen –

+0

Dziękuję bardzo za poświęcenie czasu na odpowiedź. Wykorzystanie Reverse Polish Notation było wyjątkowym sposobem radzenia sobie z pogrupowanymi operacjami, których nigdy bym nie zrobił. Zmieniłem powyższe pytanie, aby uwzględnić dodatkowe wymagania. Myślę, że te dodatkowe wymagania oznaczają, że pierwsza propozycja powyżej będzie prawdopodobnie bardziej odpowiednia. Chciałbym wiedzieć, co myślisz, jeśli masz trochę czasu na przeczytanie mojego zaktualizowanego pytania powyżej? – n4nite