- Neomodel je Pythonic OGM za Neo4j, koji nudi modele zasnovane na klasama, sprovođenje sheme i bogat API za upite pored zvaničnog drajvera.
- Trenutna izdanja prate SemVer, podržavaju moderne verzije Pythona i Neo4j-a i uvode strože provjere kardinalnosti, bolju konfiguraciju i kontrole spajanja grupa.
- Biblioteka pruža i sinhronizacijske i asinhrone API-je, automatske alate za sheme, Django integraciju i fleksibilan izlaz za sirovi Cypher za složene upite.
- Sada kao dio Neo4j Labsa, neomodel ima koristi od aktivnog održavanja, integracijskih testova i povratnih informacija iz stvarne produkcije iz korporativnih implementacija.

Neomodel je Python Object-Graph Mapper (OGM) dizajniran da rad sa Neo4j-om učini prirodnim kao pisanje regularnog Python koda. Umjesto da stalno ručno kreirate Cypher upite, opisujete svoju grafovsku domenu klasama, poljima i odnosima, a neomodelu dopuštate da se pobrine za mapiranje između Python objekata i Neo4j čvorova i odnosa. Izgrađen je na službenom Neo4j Python drajveru, sa samo tankim slojem apstrakcije, tako da dobijate visok nivo praktičnosti bez žrtvovanja velikih performansi.
Kao dio Neo4j Labs ekosistema, neomodel se aktivno održava, u potpunosti podržava moderne verzije Pythona i Neo4j-a i nudi i sinhrone i asinhrone API-je. Donosi poznate, Django-slične definicije modela, bogat API za upite, sprovođenje sheme putem kardinalnosti, ugrađene transakcije i blisku integraciju sa Djangom putem... django_neomodelIstovremeno, ostaje blizu metala: uvijek se možete prebaciti na sirovi Cypher kada to zahtijevaju performanse ili složenost upita.
Šta je neomodel i zašto je važan
Neomodel je maper grafova objekata za Neo4j bazu podataka s grafovima, koji premošćuje Python klase i strukture grafova. Umjesto ručnog kreiranja čvorova i odnosa putem Cypher stringova, definirate Python klase koje predstavljaju entitete vaše domene, a neomodel ih pretvara u označene čvorove s indeksiranim svojstvima i ograničenjima u Neo4j-u. Gradi se na vrhu službenog neo4j-python-driver, tako da je njegovo ponašanje usklađeno s onim što biste uradili direktnim korištenjem upravljačkog programa.
Biblioteka se fokusira na poznati, na klasama zasnovan stil modeliranja s robusnim nasljeđivanjem, hook-ovima i validacijom. Ovaj pristup ga čini posebno ugodnim za programere koji su navikli na Django ORM ili druge Python ORM-ove: atributi na vašim klasama modela odgovaraju svojstvima u Neo4j-u, dok posebna polja za relacije hvataju rubove grafa. S ovom postavkom, prolazak kroz graf postaje stvar praćenja atributa na objektima umjesto pisanja opširnog Cyphera svaki put.
Ispod haube, neomodel nudi moćan API za upite koji pokriva uobičajene obrasce pristupa grafovima bez da vas odmah prisiljava na korištenje sirovog Cyphera. Možete filtrirati, sređivati, prelaziti kroz veze, rezati skupove čvorova i izvoditi napredne operacije putem Pythonic interfejsa. Kada je potrebno, i dalje imate pristup cypher_query pomoćnik za izvršavanje prilagođenih upita i direktan rad s vraćenim rezultatima.
Još jedna centralna karakteristika je sprovođenje sheme putem pravila kardinalnosti na odnosima i ograničenjima svojstava. Određivanjem kardinalnosti (na primjer, nula ili više, jedan ili više ili jedan) direktno na poljima za relacije, možete primijeniti strukturna očekivanja u svom grafu i omogućiti neomodelu da vam pomogne u izbjegavanju nekonzistentnih podataka. Indeksi i ograničenja se kreiraju automatski na osnovu definicija modela, a postoje i CLI uslužni programi za njihovu primjenu ili uklanjanje iz baze podataka na kontroliran način.
Neomodel također u potpunosti podržava transakcijski rad i siguran je za upotrebu u višenitnim okruženjima. Transakcije se mogu otvoriti i potvrditi na predvidljiv način, a budući da je omotavanje oko službenog drajvera namjerno tanko, opterećenje performansi je malo. Mjerenja s alatima poput Locusta pokazuju da neomodelov sloj apstrakcije dodaje minimalnu latenciju, čak i pod istovremenim opterećenjem.
Podrška za verzije, SemVer i konfiguracija
Moderna neomodel izdanja prate semantičko verzioniranje (SemVer) koristeći klasični obrazac major.minor.patch. To znači da se ključne promjene uvode samo s većim nadogradnjama verzija, nove funkcije bez ključnih promjena dolaze kao manja izdanja, a ispravke grešaka se isporučuju kao zakrpe. Ova strategija verzija olakšava planiranje nadogradnji, posebno za produkcijske sisteme.
U seriji 6.x, neomodel cilja na ažurirane verzije Pythona i Neo4j-a kako bi se uskladio s onim što se koristi na najozbiljnijim implementacijama. Konkretno, neomodel 6.x zahtijeva Python 3.10 ili noviji i podržava Neo4j 5.x, Neo4j 4.4 LTS i noviju liniju Neo4j 2025.xx. Podržani su i Neo4j Community, Neo4j Enterprise i Neo4j Aura (hostovana usluga), što vam daje fleksibilnost u načinu i mjestu hostovanja baze podataka.
Za starija okruženja, prethodne neomodel grane i dalje pokrivaju naslijeđene kombinacije Pythona i Neo4j-a. Linija 5.x podržava Python 3.8+ sa Neo4j 5.x i 4.4 (LTS), dok linija 4.x pokriva Python od 3.7 do 3.10 i Neo4j 4.x, uključujući 4.4 LTS kada se koristi neomodel 4.0.10. Ova priča o kompatibilnosti omogućava postepenu migraciju naprijed uz održavanje postojećih postavki u funkciji.
Počevši od neomodela 6, konfiguracija se obrađuje putem moderne, tipski anotirane klase podataka s validacijom tokom izvođenja i podrškom za varijable okruženja. Umjesto raspršenih ad-hoc postavki, konfiguracijska polja se validiraju prilikom ažuriranja, uključujući provjere tipova i logička ograničenja. Varijable okruženja mogu se koristiti za jednostavno prepisivanje konfiguracije, što se dobro slaže s kontejneriziranim implementacijama i cloud okruženjima.
Izdanje 6.0 također uvodi eksplicitne promjene koje mogu uzrokovati probleme i ispravke ponašanja kako bi API bio predvidljiviji. Na primjer, razrješavanje liste iz Cyphera sada vraća očekivanu dubinu: upit poput RETURN collect(node) će mapirati na results[0][0] umjesto prethodnog, neintuitivnog results[0][0][0] struktura. Provjere kardinalnosti su strože i omogućene po zadanim postavkama, a nekoliko samostalnih pomoćnih funkcija je premješteno u centralni Database() i AsyncDatabase() singleton klase.
Instalacija i postavljanje
Preporučeni način instaliranja neomodela je direktno iz PyPI-ja koristeći vaš preferirani upravitelj paketa. Možete ga dodati u virtualno okruženje jednostavnom instalacijskom naredbom, a zatim upravljati nadogradnjama putem uobičajenih alata za ovisnosti. Ako su vam potrebne najnovije promjene ili želite doprinijeti, moguće ga je instalirati i direktno iz GitHub repozitorija.
Prije pokretanja bilo kojeg neomodel koda, morate konfigurirati URL veze kako bi biblioteka znala kako doći do vaše Neo4j instance. Ova postavka obično uključuje shemu (Bolt ili Neo4j), host, port, korisničko ime, lozinku i opcionalno ime baze podataka. Za Django projekte, ova konfiguracija se obično postavlja u settings.py tako da se inicijalizira čim se aplikacija pokrene.
Ako je vaš Neo4j server novoinstaliran, trebali biste promijeniti zadanu lozinku koristeći Neo4j preglednik ili administratorsku ploču. Podrazumevano, taj panel je dostupan na http://localhost:7474Nakon što ažurirate lozinku i potvrdite je dbms.security.auth_enabled=true U konfiguraciji baze podataka, spremni ste za povezivanje iz neomodela.
Za razvoj i testiranje, uobičajeno je koristiti odvojene Neo4j baze podataka i namjenske pristupne podatke. Neomodelov vlastiti testni paket očekuje Neo4j 4+ bazu podataka i oslanja se na specifične varijable okruženja za povezivanje. Ako pokrenete testove na potpuno novoj bazi podataka, testni paket će postaviti lozinku na test prema zadanim postavkama; ako otkrije postojeći skup podataka, odbit će nastavak osim ako eksplicitno ne proslijedite zastavicu resetiranja, što vam pomaže da izbjegnete slučajni gubitak podataka.
Kada želite testirati neomodel na više verzija Pythona i Neo4j-a, Docker i docker-compose mogu sve automatski orkestrirati. Projekat pruža konfiguraciju za pokretanje matrice verzija interpretera i Neo4j izdanja kako bi se testovi integracije mogli izvršavati konzistentno. Ovo je posebno korisno ako doprinosite funkcijama koje bi trebale raditi na nekoliko podržanih verzija.
Osnovne karakteristike: modeli, sheme i indeksi
Srž Neomodela leži u njegovim definicijama modela zasnovanim na klasama koje se direktno mapiraju na oznake i odnose čvorova Neo4j-a. Klase čvorova obično izvodite iz StructuredNodei klase odnosa iz StructuredRelPolja čvora su definirana korištenjem neomodel-specifičnih tipova svojstava, koji kontroliraju kako se podaci pohranjuju i validiraju u Neo4j-u.
Svaka klasa modela postaje oznaka u Neo4j-u, a neomodel automatski upravlja indeksima i ograničenjima na osnovu vaših definicija. To znači da se jedinstvenost, obavezna svojstva i indeksirana polja mogu specificirati u Pythonu bez potrebe za ručnim kreiranjem Cypher naredbi za kreiranje sheme. Iza kulisa, neomodel prevodi metapodatke vašeg modela u odgovarajuće Neo4j operacije sheme.
Relacije su pridružene klasama čvorova pomoću posebnih deskriptora kao što su RelationshipTo, RelationshipFrom, I Relationship. Ovi deskriptori definiraju tip odnosa, kardinalnost i smjer prelaska. RelationshipTo i RelationshipFrom izraziti jednosmjernu navigaciju iz perspektive Pythona, dok Relationship koristi se kada želite tretirati relaciju kao navigabilnu u oba smjera iz koda, iako sam Neo4j uvijek pohranjuje relacije sa smjerom.
Kada su relacije logički dvosmjerne, preporučena praksa je izbjegavanje kreiranja dva zrcalna polja i korištenje jednog Relationship Umjesto toga. Na taj način vaš model ostaje čist i konzistentan, a istovremeno omogućava prelazak u oba smjera u vašem Python kodu. Neo4j će i dalje pohranjivati usmjerenu relaciju "ispod haube", ali neomodelova apstrakcija skriva taj detalj prilikom prelaska.
Za scenarije gdje strukture čvorova nisu u potpunosti poznate unaprijed, neomodel nudi SemiStructuredNode osnovna klasa. Klase izvedene iz ovog tipa mogu sadržavati "ad-hoc" svojstva koja nisu eksplicitno definirana u modelu. Ovo je posebno korisno kada se vaša shema grafa često mijenja ili kada trebate povremeno dodati dodatne atribute bez refaktoriranja modela svaki put.
Pravila kardinalnosti nameću broj dozvoljenih odnosa između čvorova i sada su podržana strožijim provjerama u neomodelu 6. Meke provjere kardinalnosti dostupne su za sve kardinalnosti odnosa, a stroga provjera je omogućena prema zadanim postavkama. Ako vaši podaci krše konfigurirana pravila odnosa, neomodel će istaknuti taj problem umjesto da tiho dopusti da nekonzistentna struktura opstane.
Automatsko upravljanje i inspekcija sheme
Nakon što definirate ili ažurirate svoje modele, potrebno je primijeniti odgovarajuća ograničenja i indekse na Neo4j bazu podataka. Neomodel dolazi sa skriptom pod nazivom neomodel_install_labels koji skenira vaše modele i kreira ili ažurira potrebne indekse i ograničenja. Nakon izmjene vaše sheme, trebali biste pokrenuti ovaj skript i pregledati prijavljeni broj obrađenih klasa kako biste potvrdili da je sve sinhronizirano.
Ako ikada trebate obrisati ograničenja i indekse kojima upravlja neomodel, postoji komplementarna naredba pod nazivom neomodel_remove_labels. Ovaj skript automatski briše sva postojeća ograničenja i indekse koje je neomodel prethodno instalirao. Također ispisuje ono što je uklonjeno tako da jasno vidite utjecaj operacije.
Obje naredbe za upravljanje shemom podržavaju --db argument i zadano prema NEO4J_BOLT_URL varijabla okruženja kada nije navedena. Ovo ponašanje pomaže da se akreditivi i detalji veze ne objavljuju u historiji komandne linije i omogućava jednostavnu konfiguraciju putem varijabli okruženja. Također olakšava upravljanje skriptama za automatizaciju i implementaciju.
Pored kreiranja sheme, neomodel uključuje alat za inspekciju baze podataka koji može izvršiti obrnuti inženjering postojećeg grafa i generirati datoteku modela. koristeći inspect komanda (koja zahtijeva APOC procedure instalirane u Neo4j), možete skenirati bazu podataka i kreirati models.py datoteka u ciljnom direktoriju kao što je yourappGenerisana datoteka uključuje uvoze, definicije klasa čvorova i definicije odnosa koje odgovaraju detektovanoj strukturi grafa.
Proces inspekcije može se podesiti za velike grafove preskakanjem svojstava odnosa i skeniranja kardinalnosti. Za baze podataka sa stotinama hiljada čvorova i više od milion relacija, potpuno skeniranje može trajati desetine sekundi. Opcije poput --no-rel-props i --no-rel-cardinality ubrzajte stvari izostavljanjem detaljne analize, i dalje generiranjem polja za relacije, ali postavljanjem kardinalnosti na generičku vrijednost poput ZeroOrMore.
Rad sa neomodel Query API-jem
Neomodelov API za upite vam omogućava da izvršavate bogate upite nad grafovima putem Python metoda na vašim klasama modela umjesto direktnog pisanja Cyphera. Svaki model otkriva .nodes Atribut sličan menadžeru koji predstavlja skup čvorova s odgovarajućom oznakom. Odatle možete brojati, filtrirati, sređivati, rezati i preuzimati osnovne podatke grafa.
Pozivanje len(MyModel.nodes) pokreće Cypher upit koji broji čvorove s oznakom koja odgovara MyModel. Ovo nudi intuitivan način za dobijanje brojača bez napuštanja Python sintakse. Ako je vaš skup čvorova već filtriran, broj će odražavati samo čvorove koji odgovaraju tim filterima, što odgovara ponašanju koje biste očekivali od tipičnog ORM-a.
Rezanje je podržano direktno na skupovima čvorova, što je izuzetno korisno kada želite raditi sa grupisanim rezultatima. Izrazi poput MyModel.nodes[0:10] vratite isjeckani skup čvorova koji možete iterirati ili dalje povezivati s dodatnim filterima. Isjeckani skup ne vraća odmah sirovu listu, već drugi objekt skupa čvorova, tako da možete korak po korak kreirati složene upite.
Skupovi čvorova podržavaju iteraciju i boolean provjere, iako su operacije dužine i istinitosti terminalne. Nakon što procijenite len() ili koristite skup čvorova u booleovom kontekstu, efektivno pokrećete korak evaluacije koji vraća konkretan rezultat, a ne još jedan lančano ulančani objekt upita. Ovaj dizajn balansira Python idiome s lijenom prirodom izgradnje upita.
Za pronalaženje stvarnih objekata obično se koriste metode poput .all() i .get() na .nodes menadžer. Ove metode mogu dobiti lazy=True argument za vraćanje samo ID-ova čvorova umjesto punih objekata i svih njihovih svojstava. Ovo je korisno ako želite minimizirati prijenos podataka ili ručno izvršavati naknadne upite na osnovu ID-ova.
Kreiranje, ažuriranje, brisanje i odnosi
Kreiranje čvorova pomoću neomodel-a je jednostavno kao instanciranje vaše klase modela i pozivanje save(). Nakon što ste definirali svojstva i podrazumijevane vrijednosti, možete konstruirati instancu sa željenim vrijednostima polja, pozvati save, a neomodel će kreirati ili ažurirati odgovarajući čvor u Neo4j-u. Ovo je analogno načinu na koji većina ORM-ova rješava perzistenciju.
Ažuriranje čvorova prati isti obrazac: dohvati instancu, dodijeli nove vrijednosti njenim atributima i ponovo je sačuvaj. Neomodel se brine o generiranju odgovarajućeg Cyphera za modificiranje samo promijenjenih svojstava na postojećem čvoru. Ovaj pristup održava vaš kod jednostavnim i drži detalje operacija ažuriranja izvan vaše poslovne logike.
Brisanje čvora je također direktno: kada imate instancu, pozivate njenu delete() metoda. Ovo uklanja čvor i, ovisno o konfiguraciji vašeg odnosa i ograničenjima baze podataka, može ukloniti i pridružene odnose. Za naprednije ponašanje ili evidentiranje mogu se definirati kuke prije i nakon brisanja.
Odnosi između čvorova se upravljaju putem polja za odnose i praktičnih metoda kao što su connect(). Kada imate dva čvora, možete pozvati nešto poput actor.movies.connect(movie) da se kreira odgovarajuća instanca odnosa u grafu. Svojstva odnosa mogu se modelirati putem StructuredRel-bazirane klase, što vam daje prostora za pohranjivanje atributa i na rubovima.
Složeniji obilazak grafa može se postići praćenjem atributa relacija ili kombinovanjem filtera upita među relacijama. Na primjer, možete početi od Entity skup čvorova, filtriranje po nekom svojstvu, a zatim prelazak na povezane čvorove kako bi se filtrirali i njihovi atributi. Ovo postepeno gradi Cypher upit ispod haube, koji neomodel izvršava u vaše ime.
Asinhronog neomodela i transpiliranog API-ja za sinhronizaciju
Neomodel uključuje asinhronu podršku izgrađenu na asinhronim mogućnostima službenog Neo4j Python drajvera. To znači da možete integrirati Neo4j operacije u moderne asinhrone Python okvire i servise, iskorištavajući u potpunosti prednosti konkurentnosti za radna opterećenja koja uključuju mnogo I/O operacija.
Testiranje performansi alatima poput Locusta pokazalo je da asinhroni neomodel, kada se koristi istovremeno, nadmašuje i serijske upite i istovremeno izvršene sinhrone pozive neomodela. Budući da mnoge operacije s grafovima uključuju mrežne I/O operacije i čekanje odgovora baze podataka, omogućavanje petlji događaja da istovremeno obrađuje više upita donosi bolji protok i iskorištenje resursa.
Interno, neomodel održava asinhrone i sinhrone API-je usklađenima korištenjem koraka transpilacije koji pretvara asinhroni kod u njegov sinhroni ekvivalent. Za automatsko skidanje se koristi namjenska biblioteka. await ključne riječi, preimenovati klase (na primjer, uklanjanje Async prefikse) i izvršiti ciljane zamjene kao što je promjena adb to db or mark_async_test to mark_sync_testOvaj pristup izbjegava održavanje dvije potpuno odvojene kodne baze.
Kada doprinosite, prvenstveno radite na implementaciji asinhronosti pod neomodel/async_ a zatim pokrenite priloženi transpilacijski skript da biste generirali varijantu sinhronizacije. Također se možete osloniti na pre-commit hooks kako biste automatizirali ovaj korak i osigurali da obje verzije ostanu sinhronizirane. U mnogim slučajevima, vašu poslovnu logiku potrebno je napisati samo jednom u asinhronom sloju.
Neke funkcionalnosti mogu biti namijenjene samo za asinhronizaciju ili samo za sinhronizaciju, a neomodel izlaže uslužni obrazac (inspiriran službenim Neo4j drajverom) kako bi odvojio te puteve koda. Ovo vam omogućava da definirate ponašanja koja se razlikuju između dva načina rada, a istovremeno održavate koherentnost vaše ukupne API površine. Testni moduli, poput onih koji pokrivaju Match API, demonstriraju kako se asinhroni kod transpilira i kako se ponaša rezultirajući sinhroni kod.
Singletoni baze podataka i AsyncDatabase
U neomodelu 6, Database() i AsyncDatabase() Klase su implementirane kao pravi singletoni kako bi se razjasnilo kako se rukuje globalnim operacijama. Umjesto raspršivanja samostalnih uslužnih funkcija, neomodel sada grupira operacije na nivou baze podataka u ove singleton instance, čineći API vidljivijim i konzistentnijim.
Nekoliko naslijeđenih funkcija je premješteno u Database() klasa i uklonjena iz globalnog imenskog prostora. Primjeri uključuju change_neo4j_password, clear_neo4j_database, drop_constraints, drop_indexes, remove_all_labels, install_labels, I install_all_labelsAsinhroni ekvivalenti su dostupni iz AsyncDatabase() singleton, obično se naziva adb u asinhronom kontekstu.
Ovaj redizajn pojednostavljuje mentalne modele oko operacija na nivou baze podataka i izbjegava dvosmislenost u načinu na koji se rukuje konfiguracijom i globalnim stanjem. Osiguravanjem da i sinhronizirani i asinhroni načini rada dijele sličnu strukturu, postaje lakše rasuđivati o tome kada možete sigurno prelaziti s jednog pristupa na drugi ili ih pokretati jedan pored drugog u različitim dijelovima veće aplikacije.
Osim toga, izdanje 6.0 uvelo je merge_by parametar za grupne operacije, pružajući veću kontrolu nad načinom spajanja čvorova i odnosa. Možete prilagoditi koje oznake i ključevi svojstava definiraju jedinstvenost za spajanja serija, što je ključno pri rukovanju velikim količinama unosa podataka ili zadacima sinhronizacije.
Django integracija i upotreba u stvarnom svijetu
Neomodel se čisto integriše sa Djangom putem django_neomodel paket, što vam omogućava da tretirate svoje grafovske modele kao dio Django projekta. S ovom integracijom, konfiguracija se obično nalazi u settings.py, a vaše klase čvorova i relacija koegzistiraju s ostatkom vašeg Django ekosistema, uključujući aplikacije, middleware i prikaze.
Konkretan primjer je višedijelni Django tutorijal koji koristi neomodel za istraživanje i pretraživanje baze podataka grafova u stilu Paradise Papers. U prvim dijelovima postavljate Django projekat i integrišete neomodel; u kasnijim dijelovima gradite fetch_api aplikaciju, definirati modele koji odražavaju entitete, odnose i svojstva u grafu, a zatim postepeno graditi uslužne programe i prikaze na vrhu njih.
Unutar takvog projekta, možete koristiti neomodel modele direktno unutar Django prikaza, serijalizatora ili pomoćnih modula. Uobičajeni pristup je stvaranje utils.py datoteka u kojoj definirate praktične funkcije koje pozivaju Query API. Na primjer, možete implementirati count_nodes, fetch_nodes, I fetch_node_details pomoćne funkcije koje dinamički unose filtere, parametre paginacije i imena modela.
Neki podaci, kao što su liste zemalja, jurisdikcija ili izvora podataka, mogu biti skupi za ponovljeno ispitivanje, tako da ih možete unaprijed izračunati pomoću sirovog Cyphera i pohraniti kao konstante. A constants.py Modul može izvršiti te Cypher upite jednom, izvesti sortirane liste kao što je COUNTRIES, JURISDICTIONS, I DATASOURCEi omogućite im jednostavan uvoz u vašu Django aplikaciju.
Da biste osigurali da su ove konstante spremne pri pokretanju aplikacije, možete se povezati s konfiguracijom Django aplikacije definiranjem ready() metoda u fetch_api/app.py. Unutar te metode, uvozite constants.py, što pokreće početne Cypher upite i popunjava odgovarajuće liste. Na ovaj način, sljedeći zahtjevi mogu jednostavno čitati iz već pripremljenih struktura podataka.
Raw Cypher u odnosu na OGM za složene upite
Iako je neomodelov OGM idealan za svakodnevni CRUD i prolazak kroz relacije, postoje scenariji u kojima su ručno pisani Cypher upiti efikasniji. Duboko ugniježđeni traverali, upiti drugog stepena ili višestruki skokovi i sofisticirane agregacije ponekad se mogu jasnije i sa boljim performansama izraziti kao sirovi Cypher nego kao OGM lanci.
Tipičan primjer je pronalaženje ko-glumaca koji su se pojavili u bilo kojem filmu uz određenog glumca, kao što je određivanje svih ljudi koji su radili s Tomom Hanksom. Kao Cypher upit, ovo može biti prilično direktno: uparite glumca, prelazite na filmove u kojima je glumio, a zatim prelazite na druge glumce u tim filmovima, primjenjujući filtere i agregacije po potrebi. Rezultat je koncizan, optimizirani uzorak grafa.
Repliciranje istog ponašanja isključivo putem OGM metoda pogodnosti moglo bi zahtijevati proces u stilu O(n²), petljajući kroz filmove i povezane aktere na nivou Pythona. Ovo je i manje elegantno i manje efikasno nego pustiti Neo4j da obavi teški posao u jednoj Cypher naredbi. To ilustruje da OGM-ovi nisu čarobni štapić za svaki obrazac pristupa grafu.
Štaviše, kada se oslanjate na OGM operacije za duboke prolaze, oblik vraćenih podataka može postati prilično složen. Generisani Cypher će često uključivati početni čvor, međusobne odnose, susjedne čvorove i njihove odnose. Ovo može biti korisno kada vam je potreban bogat kontekst, ali može biti pretjerano kada želite samo specifične agregirane rezultate ili podskup svojstava.
U situacijama gdje su performanse i jasnoća od najveće važnosti, korištenje cypher_query Direktno izvršavanje ručno izrađenog Cyphera može biti bolja opcija. Neomodel namjerno koristi ovaj izlaz za bijeg: možete kombinirati OGM interakcije visokog nivoa s Cypher interakcijama niskog nivoa u istom projektu, birajući pravi alat za svaki određeni upit, a istovremeno zadržavajući modele kao jedini izvor istine za vašu shemu.
Neomodel u Neo4j Labsima i upravljanje projektima
Neomodelov prelazak u program Neo4j Labs formalizirao je njegov status aktivno održavanog, zajedničkog projekta s jasnim očekivanjima kvalitete. Neo4j Labs služi kao dom za eksperimentalne i napredne projekte koji imaju stvarnu podršku, ali nisu dio osnovnog proizvoda. Mnogi poznati alati, poput komponenti za nauku o grafovima podataka, biblioteke GraphQL, APOC jezgre i integracija streaminga, imaju korijene u ovom programu.
Pripadnost Neo4j Labs-u znači da se neomodel pridržava osnovnih standarda u vezi s testiranjem, sigurnosnim provjerama i automatiziranim alatima poput CI/CD cjevovoda. Tim za održavanje provodi integracijske testove na širokom spektru verzija Pythona i Neo4j-a, osiguravajući kompatibilnost s novim izdanjima. To je dijelom razlog zašto neomodel može tvrditi da podržava sve trenutno podržane verzije Pythona i Neo4j-a, kako Community tako i Enterprise.
Projekt ostaje u potpunosti otvorenog koda i usmjeren na zajednicu, a GitHub služi kao glavno središte za probleme, diskusije i doprinose. Dnevnik problema se ponovo aktivno uređuje, a starije stavke se sortiraju i sažimaju prema raspoloživom vremenu, dok je područje za diskusije otvoreno za sve i koristi se za najave i razgovore o dizajnu. Postoji barem jedan zaposlenik Neo4j-a koji djeluje kao održavatelj, povezujući iskustvo s terena s projektom.
Implementacije u stvarnom svijetu produkcije, kao što je OpenStudyBuilder od Novo Nordiska, igraju važnu ulogu u oblikovanju neomodelovog plana razvoja. Ove velike, stvarne aplikacije pružaju konkretne zahtjeve i povratne informacije koje se pretvaraju u nove funkcije i poboljšanja koja se doprinose zajednici. Ova korisna petlja pokazuje kako se korištenje u preduzećima i razvoj otvorenog koda mogu međusobno pojačavati.
Između svog Python modeliranja, snažnog Neo4j poravnanja, async i sync API-ja i aktivne evolucije podržane od strane Lab-a, neomodel nudi uvjerljiv način rada s grafovima iz Pythona, kako u malim projektima, tako i u zahtjevnim produkcijskim sistemima. Promišljeno korišteno – oslanjajući se na OGM za jasno modeliranje domena i tipične interakcije grafova, te posežući za sirovim Cypherom kada to zahtijevaju složeni obrasci ili performanse – može značajno pojednostaviti način na koji dizajnirate, postavljate upite i održavate aplikacije zasnovane na grafovima.