Neomodel Python OGM: Dubinski uvid u Neo4j modeliranje

Zadnje ažuriranje: 12/06/2025
  • Neomodel je Pythonic OGM za Neo4j, koji nudi modele temeljene na klasama, provedbu sheme i bogati API za upite uz službeni upravljački program.
  • Trenutna izdanja prate SemVer, podržavaju moderne verzije Pythona i Neo4j-a te uvode strože provjere kardinalnosti, bolju konfiguraciju i kontrole spajanja serija.
  • Biblioteka nudi API-je za sinkronizaciju i asinkronost, alate za automatsku izradu shema, integraciju s Djangom i fleksibilan izlaz za sirovi Cypher za složene upite.
  • Kao dio Neo4j Labsa, neomodel ima koristi od aktivnog održavanja, integracijskih testova i povratnih informacija iz stvarne produkcije iz poslovnih implementacija.

neomodel python ogm

Neomodel je Python Object-Graph Mapper (OGM) dizajniran da rad s Neo4j-om učini prirodnim kao pisanje regularnog Python koda. Umjesto da stalno ručno izrađujete Cypher upite, opisujete svoju grafovsku domenu klasama, poljima i odnosima, a neomodelu dopuštate mapiranje između Python objekata i Neo4j čvorova i odnosa. Izgrađen je na službenom Neo4j Python upravljačkom programu, s tankim slojem apstrakcije, tako da dobivate visoku razinu praktičnosti bez žrtvovanja većih performansi.

Kao dio ekosustava Neo4j Labs, neomodel se aktivno održava, u potpunosti podržava moderne verzije Pythona i Neo4j-a te nudi sinkrone i asinkrone API-je. Donosi poznate, Django-slične definicije modela, bogati API za upite, provedbu sheme putem kardinalnosti, ugrađene transakcije i blisku integraciju s Djangom putem django_neomodelIstovremeno, ostaje blizu metala: uvijek se možete prebaciti na sirovi Cypher kada to zahtijevaju performanse ili složenost upita.

Što je neomodel i zašto je važan

Neomodel je maper grafova objekata za Neo4j bazu podataka grafova, koji premošćuje Python klase i strukture grafova. Umjesto ručnog stvaranja č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 službenom neo4j-python-driver, tako da je njegovo ponašanje usklađeno s onim što biste učinili izravnim korištenjem upravljačkog programa.

Biblioteka se fokusira na poznati stil modeliranja temeljen na klasama s robusnim nasljeđivanjem, hookovima i validacijom. Ovaj pristup ga čini posebno praktičnim za programere naviknute na Django ORM ili druge Python ORM-ove: atributi na vašim klasama modela odgovaraju svojstvima u Neo4j-u, dok posebna polja za odnose bilježe rubove grafa. S ovom postavkom, prolazak grafa 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 sirovi Cypher. Možete filtrirati, sređivati, prelaziti odnose, rezati skupove čvorova i izvoditi napredne operacije putem Python sučelja. Kada je potrebno, i dalje imate pristup cypher_query pomoćnik za izvršavanje prilagođenih upita i izravan rad s vraćenim rezultatima.

Druga središnja značajka je provedba 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) izravno na poljima odnosa, možete nametnuti strukturna očekivanja u svom grafu i dopustiti neomodelu da vam pomogne u izbjegavanju nekonzistentnih podataka. Indeksi i ograničenja stvaraju se automatski na temelju definicija modela, a postoje CLI uslužni programi za njihovu primjenu ili uklanjanje iz baze podataka na kontrolirani način.

Neomodel također u potpunosti podržava transakcijski rad i siguran je za korištenje u višenitnim okruženjima. Transakcije se mogu otvoriti i potvrditi na predvidljiv način, a budući da je omotavanje oko službenog upravljačkog programa namjerno tanko, opterećenje performansi je malo. Mjerila s alatima poput Locusta pokazuju da neomodelov sloj apstrakcije dodaje minimalnu latenciju, čak i pod istodobnim opterećenjem.

Podrška za verzije, SemVer i konfiguracija

Moderna neomodel izdanja slijede 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 značajke bez ključnih promjena dolaze kao manja izdanja, a ispravci grešaka isporučuju se kao zakrpe. Ova strategija verzija olakšava planiranje nadogradnji, posebno za produkcijske sustave.

U seriji 6.x, neomodel cilja na ažurirane verzije Pythona i Neo4j-a kako bi odgovarao onome što se izvodi na najozbiljnijim implementacijama. Točnije, 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 (hostirana usluga), što vam daje fleksibilnost u načinu i mjestu hostiranja 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+ s 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ćuje postupnu migraciju naprijed uz održavanje postojećih postavki u radu.

Počevši od neomodela 6, konfiguracija se obrađuje putem moderne, tipski anotirane klase podataka s validacijom tijekom 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 nadjačavanje konfiguracije, što se dobro slaže s kontejneriziranim implementacijama i okruženjima u oblaku.

Izdanje 6.0 također uvodi eksplicitne promjene koje uzrokuju 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) mapirat će se na results[0][0] umjesto prethodnog, neintuitivnog results[0][0][0] struktura. Provjere kardinalnosti su strože i omogućene prema zadanim postavkama, a nekoliko samostalnih pomoćnih funkcija premješteno je u središnji Database() i AsyncDatabase() singleton klase.

Instalacija i postavljanje

Preporučeni način instalacije neomodela je izravno iz PyPI-ja pomoću vašeg preferiranog upravitelja paketa. Možete ga dodati u virtualno okruženje jednostavnom naredbom za instalaciju, a zatim upravljati nadogradnjama putem uobičajenih alata za ovisnosti. Ako trebate najnovije promjene ili želite doprinijeti, moguće ga je instalirati i izravno 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 pa se inicijalizira čim se aplikacija pokrene.

Ako je vaš Neo4j poslužitelj novoinstaliran, trebali biste promijeniti zadanu lozinku pomoću Neo4j preglednika ili administratorske ploče. Prema zadanim postavkama, ta je ploča dostupna na http://localhost:7474Nakon što ažurirate lozinku i potvrdite je dbms.security.auth_enabled=true U konfiguraciji baze podataka spremni ste za povezivanje s neomodelom.

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 pokrećete 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 izričito ne proslijedite zastavicu resetiranja, što vam pomaže u izbjegavanju slučajnog gubitka podataka.

Kada želite testirati neomodel na više verzija Pythona i Neo4j-a, Docker i docker-compose mogu sve automatski orkestrirati. Projekt pruža konfiguraciju za pokretanje matrice verzija interpretera i Neo4j izdanja kako bi se testovi integracije mogli dosljedno izvršavati. To je posebno korisno ako doprinosite značajkama koje bi trebale raditi na nekoliko podržanih verzija.

Osnovne značajke: modeli, sheme i indeksi

Srž Neomodela leži u njegovim definicijama modela temeljenim na klasama koje se izravno mapiraju na oznake i odnose čvorova Neo4j-a. Klase čvorova obično izvodite iz StructuredNodei klase odnosa iz StructuredRelPolja čvorova definirana su pomoću neomodel-specifičnih tipova svojstava, koji kontroliraju način pohranjivanja i validacije podataka u Neo4j-u.

Svaka klasa modela postaje oznaka u Neo4j-u, a neomodel automatski upravlja indeksima i ograničenjima na temelju 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 stvaranje sheme. Iza kulisa, neomodel prevodi metapodatke vašeg modela u odgovarajuće Neo4j operacije sheme.

Odnosi su pridruženi klasama čvorova pomoću posebnih deskriptora kao što su RelationshipTo, RelationshipFromi Relationship. Ovi deskriptori definiraju vrstu odnosa, kardinalnost i smjer prolaska. RelationshipTo i RelationshipFrom izraziti jednosmjernu navigaciju s gledišta Pythona, dok Relationship koristi se kada želite tretirati odnos kao navigabilan u oba smjera iz koda, iako sam Neo4j uvijek pohranjuje odnose sa smjerom.

Kada su odnosi logički dvosmjerni, preporučena praksa je izbjegavanje stvaranja dva zrcalna polja i korištenje jednog Relationship umjesto. Na taj način vaš model ostaje čist i konzistentan, a istovremeno omogućuje prolazak u oba smjera u vašem Python kodu. Neo4j će i dalje pohranjivati ​​usmjereni odnos "ispod haube", ali neomodelova apstrakcija skriva taj detalj prilikom prolaska.

Za scenarije gdje strukture čvorova nisu unaprijed u potpunosti poznate, neomodel nudi SemiStructuredNode osnovna klasa. Klase izvedene iz ovog tipa mogu sadržavati "ad-hoc" svojstva koja nisu eksplicitno definirana u modelu. To 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 dopuštenih odnosa između čvorova i sada su podržana strožim provjerama u neomodelu 6. Meke provjere kardinalnosti dostupne su za sve kardinalnosti odnosa, a stroga provjera omogućena je prema zadanim postavkama. Ako vaši podaci krše konfigurirana pravila odnosa, neomodel će istaknuti taj problem umjesto da tiho dopusti da nekonzistentna struktura ostane prisutna.

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 stvara ili ažurira potrebne indekse i ograničenja. Nakon izmjene sheme, trebali biste pokrenuti ovaj skript i pregledati prijavljeni broj obrađenih klasa kako biste potvrdili da je sve sinkronizirano.

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 što je uklonjeno kako biste jasno vidjeli utjecaj operacije.

Obje naredbe za upravljanje shemom podržavaju --db argument i zadana vrijednost NEO4J_BOLT_URL varijabla okruženja kada nije navedena. Ovo ponašanje pomaže u sprječavanju ulaska vjerodajnica i detalja veze u povijest naredbenog retka i omogućuje jednostavnu konfiguraciju putem varijabli okruženja. Također olakšava upravljanje skriptama za automatizaciju i implementaciju.

Osim stvaranja sheme, neomodel uključuje alat za pregled baze podataka koji može izvršiti obrnuti inženjering postojećeg grafa i generirati datoteku modela. Korištenje inspect naredbom (koja zahtijeva APOC procedure instalirane u Neo4j), možete skenirati bazu podataka i stvoriti models.py datoteka u ciljnom direktoriju kao što je yourappGenerirana datoteka uključuje uvoze, definicije klasa čvorova i definicije odnosa koje odgovaraju detektiranoj strukturi grafa.

Proces inspekcije može se prilagoditi za velike grafove preskakanjem svojstava odnosa i skeniranja kardinalnosti. Za baze podataka sa stotinama tisuća čvorova i više od milijun odnosa, potpuno skeniranje može trajati desetke sekundi. Opcije poput --no-rel-props i --no-rel-cardinality ubrzajte stvari izostavljanjem detaljne analize, i dalje generiranjem polja za odnose, ali postavljanjem kardinalnosti na generičku vrijednost poput ZeroOrMore.

Rad s neomodel Query API-jem

Neomodelov API za upite omogućuje vam izvođenje bogatih grafovskih upita putem Python metoda na vašim klasama modela umjesto izravnog pisanja Cyphera. Svaki model otkriva .nodes atribut nalik upravitelju koji predstavlja skup čvorova s ​​odgovarajućom oznakom. Odatle možete brojati, filtrirati, poredati, rezati i dohvaćati temeljne podatke grafa.

zvanje len(MyModel.nodes) pokreće Cypher upit koji broji čvorove s oznakom koja odgovara MyModel. Ovo nudi intuitivan način dobivanja 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 izravno na skupovima čvorova, što je izuzetno korisno kada želite raditi s grupnim rezultatima. Izrazi poput MyModel.nodes[0:10] vratiti odsječeni skup čvorova koji možete iterirati ili dalje povezivati ​​s dodatnim filterima. Odsječak ne vraća odmah sirovi popis već drugi objekt skupa čvorova, tako da možete korak po korak izrađivati ​​složene upite.

Skupovi čvorova podržavaju iteraciju i booleove provjere, iako su operacije duljine i istinitosti terminalne. Nakon što procijenite len() ili koristite skup čvorova u booleovom kontekstu, učinkovito pokrećete korak evaluacije koji vraća konkretan rezultat, a ne još jedan lančani objekt upita. Ovaj dizajn uravnotežuje Python idiome s lijenom prirodom izgradnje upita.

Za dohvaćanje 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. To je korisno ako želite smanjiti prijenos podataka ili ručno izvršavati naknadne upite na temelju ID-ova.

Stvaranje, ažuriranje, brisanje i odnosi

Stvaranje čvorova pomoću neomodela jednostavno je kao instanciranje klase modela i pozivanje save(). Nakon što ste definirali svojstva i zadane vrijednosti, možete konstruirati instancu sa željenim vrijednostima polja, pozvati save, a neomodel će stvoriti ili ažurirati odgovarajući čvor u Neo4j-u. To je analogno načinu na koji većina ORM-ova rješava perzistenciju.

Ažuriranje čvorova slijedi isti obrazac: dohvati instancu, dodijeli nove vrijednosti njenim atributima i ponovno je spremi. Neomodel se brine za generiranje odgovarajuće šifre (Cypher) za izmjenu samo promijenjenih svojstava na postojećem čvoru. Ovaj pristup održava vaš kod jednostavnim i ne uključuje detalje operacija ažuriranja u vašu poslovnu logiku.

Brisanje čvora je također direktno: nakon što imate instancu, pozivate njenu delete() metoda. Ovim se uklanja čvor i, ovisno o konfiguraciji odnosa i ograničenjima baze podataka, mogu se ukloniti i priloženi odnosi. Za naprednije ponašanje ili zapisivanje mogu se definirati kuke prije i nakon brisanja.

Odnosi između čvorova upravljaju se putem polja za odnose i praktičnih metoda kao što su connect(). Nakon što imate dva čvora, možete pozvati nešto poput actor.movies.connect(movie) za stvaranje odgovarajuće instance odnosa u grafu. Svojstva odnosa mogu se modelirati putem StructuredRelklase temeljene na -, što vam daje prostora za pohranjivanje atributa i na rubovima.

Složeniji obilazak grafa može se postići praćenjem atributa odnosa ili kombiniranjem filtera upita među odnosima. Na primjer, možete početi od Entity skup čvorova, filtrirati po nekom svojstvu, a zatim prijeći na povezane čvorove kako bi se filtrirali i njihovi atributi. To postupno gradi Cypher upit ispod haube, koji neomodel izvršava u vaše ime.

Asinkroni neomodel i transpilirani API za sinkronizaciju

Neomodel uključuje asinkronu podršku izgrađenu na asinkronim mogućnostima službenog Neo4j Python upravljačkog programa. To znači da možete integrirati Neo4j operacije u moderne asinkrone Python okvire i usluge, iskorištavajući u potpunosti prednosti konkurentnosti za opterećenja koja uključuju mnoge I/O operacije.

Testiranje performansi s alatima poput Locusta pokazalo je da asinkroni neomodel, kada se koristi istovremeno, nadmašuje i serijske upite i istovremeno izvršene sinkrone pozive neomodela. Budući da mnoge operacije s grafovima uključuju mrežne ulazno/izlazne operacije i čekanje odgovora baze podataka, omogućavanje petlji događaja da istovremeno obrađuje više upita rezultira boljom propusnošću i iskorištenjem resursa.

Interno, neomodel održava asinkrone i sinkronizacijske API-je usklađenima korištenjem koraka transpilacije koji pretvara asinkroni kod u njegov sinkroni ekvivalent. Za automatsko uklanjanje koristi se namjenska biblioteka await ključne riječi, preimenovati klase (na primjer, ukloniti Async prefikse) i izvršiti ciljane zamjene kao što je promjena adb do db or mark_async_test do mark_sync_testOvaj pristup izbjegava održavanje dvije potpuno odvojene kodne baze.

Prilikom doprinosa, prvenstveno radite na implementaciji asinkronosti pod neomodel/async_ a zatim pokrenite priloženi transpilacijski skript za generiranje varijante sinkronizacije. Također se možete osloniti na pre-commit hooks kako biste automatizirali ovaj korak i osigurali da obje verzije ostanu sinkronizirane. U mnogim slučajevima, vašu poslovnu logiku potrebno je napisati samo jednom u asinkronom sloju.

Neke funkcionalnosti mogu biti namijenjene samo za asinkronu ili samo za sinkronizaciju, a neomodel izlaže uslužni uzorak (inspiriran službenim Neo4j upravljačkim programom) za odvajanje tih putova koda. To vam omogućuje definiranje ponašanja koja se razlikuju između dva načina rada, a istovremeno održava koherentnost vaše ukupne API površine. Testni moduli, poput onih koji pokrivaju Match API, pokazuju kako se asinkroni kod transpilira i kako se ponaša rezultirajući sinkronizacijski kod.

Singletoni baze podataka i AsyncDatabase

U neomodelu 6, Database() i AsyncDatabase() Klase su implementirane kao pravi singletoni kako bi se pojasnilo kako se obrađuju globalne operacije. Umjesto raspršivanja samostalnih uslužnih funkcija, neomodel sada grupira operacije na razini baze podataka u ove singleton instance, čineći API vidljivijim i konzistentnijim.

Nekoliko naslijeđenih funkcija premješteno je 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_labelsi install_all_labelsAsinkroni ekvivalenti dostupni su iz AsyncDatabase() singleton, obično se naziva adb u asinkronom kontekstu.

Ovaj redizajn pojednostavljuje mentalne modele oko operacija na razini baze podataka i izbjegava dvosmislenost u načinu na koji se obrađuju konfiguracija i globalno stanje. Osiguravanjem da i sinkronizirani i asinkroni načini rada dijele sličnu strukturu, lakše je rasuđivati ​​o tome kada možete sigurno prijeći s jednog pristupa na drugi ili ih pokretati usporedno u različitim dijelovima veće aplikacije.

Osim toga, izdanje 6.0 uvelo je merge_by parametar za skupne 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 skupna spajanja, što je ključno pri rukovanju velikim količinama unosa podataka ili zadataka sinkronizacije.

Integracija s Djangom i upotreba u stvarnom svijetu

Neomodel se čisto integrira s Djangom putem django_neomodel paket, što vam omogućuje 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 odnosa koegzistiraju s ostatkom vašeg Django ekosustava, uključujući aplikacije, middleware i prikaze.

Konkretan primjer je višedijelni Django tutorial koji koristi neomodel za istraživanje i pretraživanje baze podataka grafova u stilu Paradise Papers. U prvim dijelovima postavljate Django projekt i integrirate neomodel; u kasnijim dijelovima gradite fetch_api aplikaciju, definirati modele koji odražavaju entitete, odnose i svojstva u grafu, a zatim postupno graditi uslužne programe i prikaze na njima.

Unutar takvog projekta, možete koristiti neomodel modele izravno unutar Django pogleda, 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, mogli biste implementirati count_nodes, fetch_nodesi fetch_node_details pomoćne funkcije koje dinamički unose filtere, parametre paginacije i nazive modela.

Neki podaci, poput popisa zemalja, jurisdikcija ili izvora podataka, mogu biti skupi za ponovljeno ispitivanje, pa 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 poput COUNTRIES, JURISDICTIONSi DATASOURCEi učinite ih jednostavnim za uvoz u vašu Django aplikaciju.

Kako 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 popise. Na taj način, sljedeći zahtjevi mogu jednostavno čitati iz već pripremljenih struktura podataka.

Raw Cypher vs 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 učinkovitiji. Duboko ugniježđeni prolasci, upiti drugog stupnja ili višestruki skokovi i sofisticirane agregacije ponekad se mogu jasnije i s boljim performansama izraziti kao sirovi Cypher nego kao OGM lanci.

Tipičan primjer je pronalaženje koglumaca koji su se pojavili u bilo kojem filmu uz određenog glumca, poput određivanja svih ljudi koji su radili s Tomom Hanksom. Kao Cypher upit, ovo može biti prilično izravno: 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 sažet, optimiziran uzorak grafa.

Repliciranje istog ponašanja isključivo putem OGM metoda praktičnosti moglo bi zahtijevati proces u stilu O(n²), petljajući kroz filmove i povezane aktere na razini Pythona. Ovo je i manje elegantno i manje učinkovito nego pustiti Neo4j da obavi teški posao u jednoj Cypher naredbi. To ilustrira da OGM-ovi nisu čarobni štapić za svaki obrazac pristupa grafu.

Štoviše, kada se oslanjate na OGM operacije za duboke prolaze, oblik vraćenih podataka može postati prilično složen. Generirani Cypher često će uključivati ​​početni čvor, međuodnose, susjedne čvorove i njihove odnose. To može biti korisno kada vam je potreban bogat kontekst, ali može biti pretjerano kada želite samo određene agregirane rezultate ili podskup svojstava.

U situacijama gdje su performanse i jasnoća najvažniji, korištenje cypher_query Izravno izvršavanje ručno izrađenog Cyphera može biti bolja opcija. Neomodel namjerno čini ovaj izlaz za bijeg: možete kombinirati OGM interakcije visoke razine s Cypherom niske razine u istom projektu, odabiruć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 ulazak 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 znanosti o grafovima podataka, GraphQL biblioteke, APOC jezgre i integracija streaminga, imaju korijene u ovom programu.

Pripadnost Neo4j Labsu znači da se neomodel pridržava osnovnih standarda oko testiranja, sigurnosnih provjera i automatiziranih alata poput CI/CD cjevovoda. Tim za održavanje provodi integracijske testove na širokom rasponu 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, i Community i Enterprise.

Projekt ostaje u potpunosti otvorenog koda i usmjeren na zajednicu, a GitHub služi kao glavno središte za probleme, rasprave i doprinose. Zapisnik problema ponovno se aktivno uređuje, a starije stavke se sortiraju i sažimaju prema potrebi, dok je područje Rasprava otvoreno za sve i koristi se za najave i razgovore o dizajnu. Postoji barem jedan zaposlenik Neo4j-a koji djeluje kao održavatelj i povezuje terensko iskustvo natrag u projekt.

Implementacije u stvarnom svijetu, poput OpenStudyBuildera tvrtke Novo Nordisk, 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 značajke i poboljšanja koja se vraćaju zajednici. Ova korisna petlja pokazuje kako se korištenje u poduzećima i razvoj otvorenog koda mogu međusobno pojačavati.

Između svog Python modeliranja, snažnog Neo4j poravnanja, async i sync API-ja te aktivne evolucije podržane od strane Laba, neomodel nudi uvjerljiv način rada s grafovima iz Pythona i u malim projektima i u zahtjevnim produkcijskim sustavima. Promišljeno korišteno - oslanjajući se na OGM za jasno modeliranje domene i tipične interakcije grafova, te posežući za sirovim Cypheronom kada to zahtijevaju složeni obrasci ili performanse - može značajno pojednostaviti način dizajniranja, ispitivanja i održavanja aplikacija temeljenih na grafovima.

Povezani postovi: