- Neomodel je Pythonic OGM pre Neo4j, ktorý ponúka modely založené na triedach, vynucovanie schém a bohaté API pre dotazy okrem oficiálneho ovládača.
- Aktuálne vydania sledujú SemVer, podporujú moderné verzie Pythonu a Neo4j a zavádzajú prísnejšie kontroly kardinality, lepšiu konfiguráciu a dávkové zlúčenie.
- Knižnica poskytuje synchronizačné aj asynchrónne API, nástroje pre automatické schémy, integráciu Django a flexibilný únikový poklop k surovému Cypheru pre zložité dotazy.
- Spoločnosť neomodel, ktorá je teraz súčasťou Neo4j Labs, využíva výhody aktívnej údržby, integračných testov a spätnej väzby z reálnych podnikových nasadení.
Neomodel je mapovač objektových grafov (OGM) v jazyku Python, ktorý je navrhnutý tak, aby práca s Neo4j bola rovnako prirodzená ako písanie bežného kódu v jazyku Python. Namiesto neustáleho manuálneho vytvárania Cypher dotazov popíšete svoju grafovú doménu pomocou tried, polí a vzťahov a necháte neomodel spracovať mapovanie medzi objektmi Pythonu a uzlami a vzťahmi Neo4j. Je postavený na oficiálnom ovládači Neo4j Python, iba s tenkou vrstvou abstrakcie, takže získate vysoké pohodlie bez toho, aby ste obetovali veľký výkon.
Ako súčasť ekosystému Neo4j Labs je neomodel aktívne udržiavaný, plne podporuje moderné verzie Pythonu a Neo4j a ponúka synchrónne aj asynchrónne API. Prináša známe definície modelov podobné Djangu, bohaté API pre dotazy, vynucovanie schémy prostredníctvom kardinality, vstavané transakcie a úzku integráciu s Djangom prostredníctvom... django_neomodelZároveň zostáva takmer pri základoch: vždy môžete prejsť na surový Cypher, keď si to vyžaduje výkon alebo zložitosť dotazov.
Čo je neomodel a prečo je dôležitý
Neomodel je mapovač grafov objektov pre grafovú databázu Neo4j, ktorý premosťuje triedy Pythonu a grafové štruktúry. Namiesto manuálneho vytvárania uzlov a vzťahov pomocou reťazcov Cypher definujete triedy Pythonu, ktoré reprezentujú entity vašej domény, a neomodel ich v Neo4j premení na označené uzly s indexovanými vlastnosťami a obmedzeniami. Stavia na oficiálnom neo4j-python-driver, takže jeho správanie je v súlade s tým, čo by ste robili pri priamom použití ovládača.
Knižnica sa zameriava na známy štýl modelovania založený na triedach s robustnou dedičnosťou, hookmi a validáciou. Tento prístup je obzvlášť pohodlný pre vývojárov zvyknutých na Django ORM alebo iné Python ORM: atribúty vo vašich modelových triedach zodpovedajú vlastnostiam v Neo4j, zatiaľ čo špeciálne polia vzťahov zachytávajú hrany grafu. S týmto nastavením sa prechádzanie grafom stáva záležitosťou sledovania atribútov objektov namiesto písania podrobného Cypheru zakaždým.
V podstate neomodel ponúka výkonné API pre dotazy, ktoré pokrýva bežné vzory prístupu do grafov bez toho, aby vás okamžite nútilo používať surový Cypher. Prostredníctvom rozhrania Pythonic môžete filtrovať, zoradiť, prechádzať vzťahmi, rozdeľovať sady uzlov a vykonávať pokročilé operácie. V prípade potreby máte stále prístup k cypher_query pomocník na vykonávanie vlastných dotazov a priamu prácu s vrátenými výsledkami.
Ďalšou ústrednou funkciou je vynucovanie schémy prostredníctvom pravidiel kardinality pre vzťahy a obmedzenia vlastností. Zadaním kardinality (napríklad nula alebo viac, jedna alebo viac alebo jedna) priamo v poliach vzťahov môžete v grafe vynútiť štrukturálne očakávania a nechať neomodel pomôcť vám vyhnúť sa nekonzistentným údajom. Indexy a obmedzenia sa vytvárajú automaticky na základe definícií modelu a existujú nástroje CLI na ich kontrolované použitie alebo odstránenie z databázy.
Neomodel tiež plne podporuje transakčnú prácu a je bezpečný na použitie vo viacvláknových prostrediach. Transakcie je možné otvárať a potvrdzovať predvídateľným spôsobom a keďže obalenie okolo oficiálneho ovládača je zámerne tenké, réžia výkonu je malá. Benchmarky s nástrojmi ako Locust ukazujú, že abstrakčná vrstva neomodelu pridáva minimálnu latenciu, a to aj pri súbežnom zaťažení.
Podpora verzií, SemVer a konfigurácia
Moderné vydania neomodelov používajú sémantické verziovanie (SemVer) s použitím klasického vzoru major.minor.patch. To znamená, že zásadné zmeny sa zavádzajú iba s hlavnými aktualizáciami verzií, nové funkcie bez zásadného správania sa vydávajú ako menšie vydania a opravy chýb sa dodávajú ako záplaty. Táto stratégia verziovania uľahčuje plánovanie aktualizácií, najmä pre produkčné systémy.
V sérii 6.x sa neomodel zameriava na aktuálne verzie Pythonu a Neo4j, aby zodpovedali tomu, čo beží na väčšine serióznych nasadení. Konkrétne, neomodel 6.x vyžaduje Python 3.10 alebo novší a podporuje Neo4j 5.x, Neo4j 4.4 LTS a novší rad Neo4j 2025.xx. Podporované sú Neo4j Community, Neo4j Enterprise aj Neo4j Aura (hostovaná služba), čo vám dáva flexibilitu v tom, ako a kde hosťujete databázu.
Pre staršie prostredia predchádzajúce vetvy neomodelu stále pokrývajú staršie kombinácie Pythonu a Neo4j. Rad 5.x podporuje Python 3.8+ s Neo4j 5.x a 4.4 (LTS), zatiaľ čo rad 4.x pokrýva Python 3.7 až 3.10 a Neo4j 4.x vrátane 4.4 LTS pri použití neomodelu 4.0.10. Tento príbeh kompatibility umožňuje postupnú migráciu vpred a zároveň zachovanie existujúcich nastavení v prevádzke.
Počnúc verziou neomodel 6 sa konfigurácia spracováva prostredníctvom modernej, typovo anotovanej dátovej triedy s validáciou za behu a podporou premenných prostredia. Namiesto roztrúsených ad-hoc nastavení sa konfiguračné polia overujú pri aktualizácii vrátane kontrol typov a logických obmedzení. Premenné prostredia možno použiť na bezproblémové prepísanie konfigurácie, čo sa hodí k kontajnerovým nasadeniam a cloudovým prostrediam.
Verzia 6.0 tiež prináša explicitné zmeny a opravy správania, vďaka ktorým je API predvídateľnejšie. Napríklad rozlíšenie zoznamu z Cypheru teraz vracia očakávanú hĺbku: dotaz ako RETURN collect(node) namapuje na results[0][0] namiesto predchádzajúceho, neintuitívneho results[0][0][0] štruktúra. Kontroly kardinality sú prísnejšie a štandardne povolené a niekoľko samostatných pomocných funkcií bolo presunutých do centrálneho Database() a AsyncDatabase() singletonové triedy.
Inštalácia a nastavenie
Odporúčaný spôsob inštalácie neomodelu je priamo z PyPI pomocou vášho preferovaného správcu balíkov. Môžete ho pridať do virtuálneho prostredia jednoduchým inštalačným príkazom a potom spravovať aktualizácie pomocou bežných nástrojov na správu závislostí. Ak potrebujete najnovšie zmeny alebo chcete prispieť, je tiež možné ho nainštalovať priamo z repozitára GitHub.
Pred spustením akéhokoľvek kódu neomodel musíte nakonfigurovať URL adresu pripojenia, aby knižnica vedela, ako sa dostať k vašej inštancii Neo4j. Toto nastavenie zvyčajne zahŕňa schému (Bolt alebo Neo4j), hostiteľa, port, používateľské meno, heslo a voliteľný názov databázy. V prípade projektov Django sa táto konfigurácia zvyčajne umiestňuje do settings.py takže sa inicializuje hneď po spustení aplikácie.
Ak je váš server Neo4j novo nainštalovaný, mali by ste zmeniť predvolené heslo pomocou prehliadača alebo administrátorského panela Neo4j. Predvolene je tento panel prístupný na adrese http://localhost:7474Po aktualizácii hesla a jeho potvrdení dbms.security.auth_enabled=true v konfigurácii databázy ste pripravení na pripojenie z neomodelu.
Pre vývoj a testovanie je bežné používať samostatné databázy Neo4j a vyhradené prihlasovacie údaje. Vlastná testovacia sada spoločnosti Neomodel očakáva databázu Neo4j 4+ a na pripojenie sa spolieha na špecifické premenné prostredia. Ak spustíte testy na úplne novej databáze, testovacia sada nastaví heslo na test štandardne; ak zistí existujúcu množinu údajov, odmietne pokračovať, pokiaľ explicitne neodošlete príznak resetovania, čo vám pomôže vyhnúť sa náhodnej strate údajov.
Ak chcete testovať neomodel vo viacerých verziách Pythonu a Neo4j, Docker a docker-compose dokážu všetko automaticky orchestrovať. Projekt poskytuje konfiguráciu na spustenie matice verzií interpretov a vydaní Neo4j, aby sa integračné testy mohli vykonávať konzistentne. Toto je obzvlášť užitočné, ak prispievate funkciami, ktoré by mali fungovať vo viacerých podporovaných verziách.
Základné funkcie: modely, schémy a indexy
Srdcom Neomodelu sú jeho definície modelov založené na triedach, ktoré sa priamo mapujú na označenia a vzťahy uzlov Neo4j. Triedy uzlov zvyčajne odvodzujete z StructuredNodea triedy vzťahov z StructuredRelPolia uzlov sú definované pomocou typov vlastností špecifických pre neomodel, ktoré riadia spôsob ukladania a overovania údajov v Neo4j.
Každá trieda modelu sa v Neo4j stáva označením a neomodel automaticky spravuje indexy a obmedzenia na základe vašich definícií. To znamená, že jedinečnosť, požadované vlastnosti a indexované polia je možné špecifikovať v Pythone bez nutnosti manuálneho vytvárania príkazov Cypher na vytvorenie schémy. V zákulisí neomodel prekladá metadáta vášho modelu do príslušných operácií schémy Neo4j.
Vzťahy sú pripojené k triedam uzlov pomocou špeciálnych deskriptorov, ako napríklad RelationshipTo, RelationshipFroma Relationship. Tieto deskriptory definujú typ vzťahu, kardinálnosť a smer prechodu. RelationshipTo a RelationshipFrom vyjadriť jednosmernú navigáciu z pohľadu Pythonu, zatiaľ čo Relationship používa sa, keď chcete vzťah považovať za navigovateľný v oboch smeroch z kódu, aj keď samotný Neo4j vždy ukladá vzťahy so smerom.
Keď sú vzťahy logicky obojsmerné, odporúčaným postupom je vyhnúť sa vytváraniu dvoch zrkadlených polí a použiť len jedno Relationship miesto. Vďaka tomu zostane váš model čistý a konzistentný a zároveň umožní prechod v oboch smeroch vo vašom kóde Python. Neo4j bude stále uchovávať smerovaný vzťah „pod kapotou“, ale abstrakcia neomodelu tento detail pri prechode skryje.
Pre scenáre, kde štruktúry uzlov nie sú vopred úplne známe, neomodel ponúka SemiStructuredNode základná trieda. Triedy odvodené od tohto typu môžu obsahovať „ad-hoc“ vlastnosti, ktoré neboli v modeli explicitne definované. To je obzvlášť užitočné, keď sa vaša schéma grafu často vyvíja alebo keď potrebujete príležitostne pripojiť ďalšie atribúty bez toho, aby ste museli model zakaždým refaktorovať.
Pravidlá kardinality vynucujú počet povolených vzťahov medzi uzlami a v neomodele 6 sú teraz podporené prísnejšími kontrolami. Pre všetky kardinality vzťahov sú k dispozícii mäkké kontroly kardinality a prísna kontrola je predvolene povolená. Ak vaše údaje porušujú nakonfigurované pravidlá vzťahov, neomodel tento problém odhalí, namiesto toho, aby potichu nechal nekonzistentnú štruktúru pretrvávať.
Automatická správa a kontrola schém
Po definovaní alebo aktualizácii modelov je potrebné na databázu Neo4j použiť zodpovedajúce obmedzenia a indexy. Neomodel sa dodáva so skriptom s názvom neomodel_install_labels ktorý prehľadáva vaše modely a vytvára alebo aktualizuje požadované indexy a obmedzenia. Po zmene schémy by ste mali spustiť tento skript a skontrolovať nahlásený počet spracovaných tried, aby ste sa uistili, že je všetko synchronizované.
Ak niekedy budete potrebovať vymazať obmedzenia a indexy spravované neomodelom, existuje doplnkový príkaz s názvom neomodel_remove_labels. Tento skript automaticky odstráni všetky existujúce obmedzenia a indexy, ktoré neomodel predtým nainštaloval. Taktiež vypíše, čo bolo odstránené, aby ste jasne videli dopad operácie.
Oba príkazy na správu schém podporujú --db argument a predvolená hodnota pre NEO4J_BOLT_URL premenná prostredia, ak nie je poskytnutá. Toto správanie pomáha udržať poverenia a podrobnosti o pripojení mimo histórie príkazového riadka a umožňuje jednoduchú konfiguráciu prostredníctvom premenných prostredia. Taktiež uľahčuje správu automatizačných a nasadzovacích skriptov.
Okrem vytvárania schémy obsahuje neomodel aj nástroj na kontrolu databázy, ktorý dokáže spätne analyzovať existujúci graf a vygenerovať súbor modelu. Použitie inspect príkaz (ktorý vyžaduje procedúry APOC nainštalované v Neo4j), môžete skenovať databázu a vytvoriť models.py súbor v cieľovom adresári, ako napríklad yourappVygenerovaný súbor obsahuje importy, definície tried uzlov a definície vzťahov, ktoré zodpovedajú detekovanej štruktúre grafu.
Proces kontroly je možné vyladiť pre veľké grafy preskočením vlastností vzťahov a skenovaním kardinality. V prípade databáz so stovkami tisíc uzlov a viac ako miliónom vzťahov môže úplné skenovanie trvať desiatky sekúnd. Možnosti ako --no-rel-props a --no-rel-cardinality Zrýchlite veci vynechaním podrobnej analýzy, stále generovaním polí vzťahov, ale predvolenou kardinálnosťou na všeobecnú hodnotu, ako napríklad ZeroAreMore.
Práca s rozhraním neomodel Query API
Rozhranie API dotazov Neomodel vám umožňuje vykonávať bohaté dotazy na grafy prostredníctvom metód Pythonu na vašich modelových triedach namiesto priameho písania v jazyku Cypher. Každý model odhaľuje .nodes atribút podobný správcovi, ktorý predstavuje množinu uzlov s príslušným označením. Odtiaľ môžete počítať, filtrovať, zoradiť, rozrezať a načítať podkladové dáta grafu.
povolania len(MyModel.nodes) spustí dotaz Cypher, ktorý spočíta uzly s označením zodpovedajúcim MyModel. Toto ponúka intuitívny spôsob získania počtov bez opustenia syntaxe Pythonu. Ak je vaša sada uzlov už filtrovaná, počet bude odrážať iba uzly, ktoré zodpovedajú týmto filtrom, čo zodpovedá správaniu, ktoré by ste očakávali od typického ORM.
Krájanie je podporované priamo na množinách uzlov, čo je mimoriadne užitočné, keď chcete pracovať s dávkovými výsledkami. Výrazy ako MyModel.nodes[0:10] vrátiť rozdelenú množinu uzlov, ktorú môžete iterovať alebo ďalej reťaziť s ďalšími filtrami. Rez nevracia okamžite surový zoznam, ale iný objekt množiny uzlov, takže môžete krok za krokom vytvárať zložité dotazy.
Množiny uzlov podporujú iteračné a boolovské kontroly, hoci operácie s dĺžkou a pravdivosťou sú terminálové. Keď vyhodnotíte len() alebo použijete sadu uzlov v boolovskom kontexte, efektívne spúšťate krok vyhodnotenia, ktorý vracia konkrétny výsledok, a nie ďalší reťaziteľný objekt dotazu. Tento dizajn vyvažuje idiomy Pythonu s lenivou povahou vytvárania dotazov.
Na načítanie skutočných objektov sa zvyčajne používajú metódy ako .all() a .get() na .nodes manažér. Tieto metódy môžu získať lazy=True argument na vrátenie iba ID uzlov namiesto celých objektov a všetkých ich vlastností. Toto je užitočné, ak chcete minimalizovať prenos údajov alebo manuálne vykonávať následné dotazy na základe ID.
Vytváranie, aktualizácia, odstraňovanie a vzťahy
Vytvorenie uzlov pomocou neomodelu je také jednoduché ako vytvorenie inštancie triedy modelu a volanie save(). Keď definujete vlastnosti a predvolené hodnoty, môžete vytvoriť inštanciu s požadovanými hodnotami polí a vyvolať ju savea neomodel vytvorí alebo aktualizuje zodpovedajúci uzol v Neo4j. Je to analogické s tým, ako väčšina ORM rieši perzistenciu.
Aktualizácia uzlov sa riadi rovnakým vzorom: načítanie inštancie, priradenie nových hodnôt jej atribútom a jej opätovné uloženie. Neomodel sa postará o generovanie správneho kódu Cypher na úpravu iba zmenených vlastností na existujúcom uzle. Tento prístup udržiava váš kód jednoduchý a detaily operácií aktualizácie sú mimo vašej obchodnej logiky.
Odstránenie uzla je tiež priame: akonáhle máte inštanciu, zavoláte jej delete() metóda. Týmto sa odstráni uzol a v závislosti od konfigurácie vášho vzťahu a obmedzení databázy sa môžu odstrániť aj pripojené vzťahy. Pre pokročilejšie správanie alebo protokolovanie je možné definovať hooky pred odstránením a po odstránení.
Vzťahy medzi uzlami sa spravujú pomocou polí vzťahov a metód, ako napríklad connect(). Keď máte dva uzly, môžete zavolať niečo ako actor.movies.connect(movie) vytvoriť vhodnú inštanciu vzťahu v grafe. Vlastnosti vzťahu je možné modelovať pomocou StructuredReltriedy založené na -, čo vám dáva priestor na ukladanie atribútov aj na hranách.
Zložitejšie prechody grafov je možné dosiahnuť sledovaním atribútov vzťahov alebo kombináciou filtrov dotazov naprieč vzťahmi. Napríklad môžete začať od Entity množinu uzlov, filtrovať podľa nejakej vlastnosti a potom prejsť na súvisiace uzly, aby sa filtrovali aj ich atribúty. Týmto sa postupne vytvorí dotaz Cypher, ktorý neomodel vykoná za vás.
Async neomodel a transpilované synchronizačné API
Neomodel obsahuje asynchrónnu podporu postavenú na asynchrónnych možnostiach oficiálneho ovládača Neo4j pre Python. To znamená, že môžete integrovať operácie Neo4j do moderných asynchrónnych rámcov a služieb Pythonu a naplno využiť výhody súbežnosti pre pracovné zaťaženia, ktoré zahŕňajú veľa operácií viazaných na I/O.
Testovanie výkonu s nástrojmi ako Locust ukázalo, že asynchrónny neomodel pri súbežnom použití prekonáva sériové dotazy aj súbežne vykonávané synchrónne volania neomodelu. Keďže mnohé operácie s grafmi zahŕňajú sieťové I/O operácie a čakanie na odpovede databázy, ponechanie slučky udalostí na spracovanie viacerých dotazov naraz prináša lepšiu priepustnosť a využitie zdrojov.
Interne neomodel udržiava asynchrónne a synchronizačné API zarovnané pomocou transpilačného kroku, ktorý konvertuje asynchrónny kód na jeho synchrónny ekvivalent. Na automatické odstraňovanie sa používa špeciálna knižnica await kľúčové slová, premenovanie tried (napríklad odstránenie Async predpony) a vykonávať cielené náhrady, ako napríklad zmenu adb na db or mark_async_test na mark_sync_testTento prístup sa vyhýba udržiavaniu dvoch úplne oddelených kódových báz.
Pri prispievaní pracujete predovšetkým na implementácii asynchrónnych kódov v rámci neomodel/async_ a potom spustite poskytnutý transpilačný skript na vygenerovanie synchronizačného variantu. Môžete sa tiež spoľahnúť na pre-commit hooky, ktoré tento krok automatizujú a zabezpečia synchronizáciu oboch verzií. V mnohých prípadoch stačí vašu obchodnú logiku zapísať v asynchrónnej vrstve iba raz.
Niektoré funkcie môžu byť určené iba na asynchrónne alebo iba na synchronizačné použitie a neomodel poskytuje úžitkový vzor (inšpirovaný oficiálnym ovládačom Neo4j) na oddelenie týchto kódových ciest. Toto vám umožňuje definovať správanie, ktoré sa medzi týmito dvoma režimami líši, pričom zachováva celkovú koherenciu vášho rozhrania API. Testovacie moduly, ako napríklad tie, ktoré pokrývajú rozhranie Match API, demonštrujú, ako sa transpiluje asynchrónny kód a ako sa správa výsledný synchronizačný kód.
Databázové a AsyncDatabase singletony
V neomodele 6, Database() a AsyncDatabase() Triedy sú implementované ako skutočné singletony, aby sa objasnilo, ako sa spracovávajú globálne operácie. Namiesto rozptyľovania samostatných úžitkových funkcií neomodel teraz zoskupuje operácie v celej databáze do týchto singleton inštancií, čím sa API stáva ľahšie objaviteľným a konzistentným.
Niekoľko starších funkcií bolo presunutých do Database() trieda a odstránená z globálneho menného priestoru. Príklady zahŕňajú change_neo4j_password, clear_neo4j_database, drop_constraints, drop_indexes, remove_all_labels, install_labelsa install_all_labelsAsynchrónne náprotivky sú prístupné z AsyncDatabase() singleton, zvyčajne označovaný ako adb v asynchrónnom kontexte.
Táto prepracovanosť zjednodušuje mentálne modely okolo operácií na úrovni databázy a vyhýba sa nejednoznačnosti v spôsobe spracovania konfigurácie a globálneho stavu. Zabezpečením podobnej štruktúry synchronizačného aj asynchrónneho režimu je tiež jednoduchšie uvažovať o tom, kedy môžete bezpečne prepnúť z jedného prístupu na druhý alebo ich spúšťať vedľa seba v rôznych častiach väčšej aplikácie.
Okrem toho verzia 6.0 priniesla a merge_by parameter pre dávkové operácie, ktorý poskytuje väčšiu kontrolu nad tým, ako sa uzly a vzťahy zlučujú. Môžete prispôsobiť, ktoré označenia a kľúče vlastností definujú jedinečnosť pre dávkové zlúčenia, čo je kľúčové pri spracovaní veľkého množstva úloh prijímania údajov alebo synchronizácie.
Integrácia s Djangom a jeho využitie v reálnom svete
Neomodel sa čisto integruje s Djangom prostredníctvom django_neomodel balík, ktorý vám umožňuje zaobchádzať s vašimi grafovými modelmi ako so súčasťou projektu Django. Pri tejto integrácii sa konfigurácia zvyčajne nachádza v settings.pya vaše triedy uzlov a vzťahov existujú súčasne so zvyškom vášho ekosystému Django vrátane aplikácií, middlewaru a zobrazení.
Konkrétnym príkladom je viacdielny tutoriál Djanga, ktorý používa neomodel na preskúmanie a prehľadávanie grafovej databázy v štýle Paradise Papers. V prvých častiach nastavíte projekt Django a integrujete neomodel; v neskorších častiach vytvoríte fetch_api aplikáciu, definovať modely, ktoré odrážajú entity, vzťahy a vlastnosti v grafe, a potom na nich postupne vytvárať nástroje a zobrazenia.
V rámci takéhoto projektu môžete použiť modely neomodel priamo v Django zobrazeniach, serializátoroch alebo pomocných moduloch. Bežným prístupom je vytvorenie utils.py súbor, v ktorom definujete funkcie na uľahčenie používania, ktoré volajú rozhranie API dotazov. Môžete napríklad implementovať count_nodes, fetch_nodesa fetch_node_details pomocné programy, ktoré dynamicky prijímajú filtre, parametre stránkovania a názvy modelov.
Niektoré údaje, ako napríklad zoznamy krajín, jurisdikcií alebo zdrojov údajov, môžu byť nákladné na opakované dotazovanie, takže ich môžete predpočítať pomocou nespracovaného Cypheru a uložiť ich ako konštanty. A constants.py modul dokáže tieto Cypher dotazy vykonať raz, odvodiť zoradené zoznamy ako COUNTRIES, JURISDICTIONSa DATASOURCEa umožnite ich jednoduchý import do vašej aplikácie Django.
Aby ste zabezpečili, že tieto konštanty budú pripravené pri spustení aplikácie, môžete sa pripojiť ku konfigurácii aplikácie Django definovaním ready() metóda v fetch_api/app.py. V rámci tejto metódy importujete constants.py, čo spúšťa počiatočné dotazy Cypheru a napĺňa zodpovedajúce zoznamy. Týmto spôsobom môžu následné požiadavky jednoducho čítať z už pripravených dátových štruktúr.
Raw Cypher vs. OGM pre zložité dotazy
Aj keď je neomodel OGM ideálny pre každodenné CRUD a prechádzanie vzťahmi, existujú scenáre, v ktorých sú manuálne písané Cypher dotazy efektívnejšie. Hlboko vnorené prechody, dotazy druhého stupňa alebo viacskokové dotazy a sofistikované agregácie je niekedy možné vyjadriť jasnejšie a s lepším výkonom ako surový Cypher než ako reťazce OGM.
Typickým príkladom je vyhľadávanie hercov, ktorí sa objavili v akomkoľvek filme po boku konkrétneho herca, napríklad určenie všetkých ľudí, ktorí spolupracovali s Tomom Hanksom. Ako dotaz Cypher to môže byť celkom priame: porovnáte herca, prejdete k filmom, v ktorých hral, a potom prejdete k ďalším hercom v týchto filmoch, pričom podľa potreby použijete filtre a agregácie. Výsledkom je stručný, optimalizovaný grafový vzor.
Replikácia rovnakého správania čisto pomocou metód OGM by mohla vyžadovať proces v štýle O(n²), ktorý by prechádzal filmy a súvisiacich aktérov na úrovni Pythonu. Toto je menej elegantné aj menej efektívne, ako nechať Neo4j zvládnuť ťažkú prácu v jednom príkaze Cypher. Ilustruje to, že OGM nie sú zázračným riešením pre každý prístupový vzor grafu.
Navyše, keď sa pri hlbokých prechodoch spoliehate na operácie OGM, tvar vrátených údajov sa môže stať dosť zložitým. Vygenerovaný Cypher bude často obsahovať počiatočný uzol, medziľahlé vzťahy, susedné uzly a ich vzťahy. To môže byť výhodné, keď potrebujete bohatý kontext, ale môže to byť zbytočné, ak chcete iba konkrétne agregované výsledky alebo podmnožinu vlastností.
V situáciách, kde sú výkon a prehľadnosť prvoradé, použitie cypher_query Priame spustenie ručne vytvoreného Cypheru môže byť lepšou možnosťou. Neomodel robí tento únikový poklop zámerným: v tom istom projekte môžete kombinovať a porovnávať interakcie OGM na vysokej úrovni s nízkoúrovňovým Cyphrom, pričom si môžete vybrať správny nástroj pre každý konkrétny dotaz a zároveň zachovať modely ako jediný zdroj pravdy pre vašu schému.
Neomodel v Neo4j Labs a riadenie projektov
Prechod spoločnosti Neomodel do programu Neo4j Labs formalizoval jej status aktívne udržiavaného, komunitou riadeného projektu s jasnými očakávaniami kvality. Neo4j Labs slúži ako domov pre experimentálne a pokročilé projekty, ktoré majú skutočnú popularitu, ale nie sú súčasťou hlavného produktu. Mnoho známych nástrojov, ako sú komponenty grafovej dátovej vedy, knižnica GraphQL, jadro APOC a streamovacie integrácie, má korene v tomto programe.
Príslušnosť k Neo4j Labs znamená, že neomodel dodržiava základné štandardy týkajúce sa testovania, bezpečnostných kontrol a automatizovaných nástrojov, ako sú CI/CD pipelines. Tím údržby vykonáva integračné testy so širokou škálou verzií Pythonu a Neo4j, čím zabezpečuje kompatibilitu s vydaním nových vydaní. To je čiastočne dôvod, prečo si neomodel môže nárokovať plnú podporu pre všetky aktuálne podporované verzie Pythonu a Neo4j, a to ako pre komunitné, tak aj pre podnikové verzie.
Projekt zostáva plne open source a zameraný na komunitu, pričom GitHub slúži ako hlavné centrum pre problémy, diskusie a príspevky. Záznam o problémoch je opäť aktívne spravovaný, pričom staršie položky sa podľa potreby triedia a sumarizujú, zatiaľ čo sekcia Diskusie je otvorená pre všetkých a používa sa na oznámenia a diskusie o dizajne. Ako správca projektu pôsobí aspoň jeden zamestnanec Neo4j, ktorý prepája praktické skúsenosti späť do projektu.
Nasadenia v reálnom svete, ako napríklad OpenStudyBuilder od spoločnosti Novo Nordisk, zohrávajú dôležitú úlohu pri formovaní plánu neomodelu. Tieto rozsiahle, reálne aplikácie poskytujú konkrétne požiadavky a spätnú väzbu, ktoré sa premietajú do nových funkcií a vylepšení, ktoré sa spätne odovzdávajú komunite. Táto pozitívna slučka ukazuje, ako sa podnikové využitie a vývoj s otvoreným zdrojovým kódom môžu navzájom posilňovať.
Vďaka modelovaniu v jazyku Python, silnému zarovnaniu v jazyku Neo4j, asynchrónnym a synchronizačným API a aktívnemu vývoju podporenému v Lab ponúka neomodel presvedčivý spôsob práce s grafmi z jazyka Python v malých projektoch aj v náročných produkčných systémoch. Pri premyslenom použití – s opieraním sa o OGM pre jasné modelovanie domén a typické interakcie grafov a siahaním po surovom Cypheri, keď si to vyžadujú zložité vzory alebo výkon – môže výrazne zjednodušiť spôsob návrhu, dotazovania a údržby aplikácií založených na grafoch.