- Neomodel er en Pythonic OGM til Neo4j, der tilbyder klassebaserede modeller, skemahåndhævelse og en omfattende forespørgsels-API oven i den officielle driver.
- Nuværende udgivelser følger SemVer, understøtter moderne Python- og Neo4j-versioner og introducerer strengere kardinalitetskontroller, bedre konfiguration og batch-fletningskontroller.
- Biblioteket tilbyder både synkroniserede og asynkrone API'er, automatiske skemaværktøjer, Django-integration og en fleksibel nødluge til raw Cypher til komplekse forespørgsler.
- Som en del af Neo4j Labs drager neomodel fordel af aktiv vedligeholdelse, integrationstests og feedback fra den virkelige verden i produktionen fra virksomhedsimplementeringer.

Neomodel er en Python Object-Graph Mapper (OGM), der er designet til at gøre det lige så naturligt at arbejde med Neo4j som at skrive almindelig Python-kode. I stedet for at lave Cypher-forespørgsler manuelt hele tiden, beskriver du dit grafdomæne med klasser, felter og relationer, og lader neomodel håndtere kortlægningen mellem Python-objekter og Neo4j-noder og -relationer. Det er bygget oven på den officielle Neo4j Python-driver med kun et tyndt abstraktionslag, så du får høj bekvemmelighed uden at ofre meget ydeevne.
Som en del af Neo4j Labs-økosystemet vedligeholdes neomodel aktivt, understøtter fuldt ud moderne Python- og Neo4j-versioner og tilbyder både synkrone og asynkrone API'er. Den bringer velkendte, Django-lignende modeldefinitioner, en omfattende forespørgsels-API, skemahåndhævelse via kardinalitet, indbyggede transaktioner og tæt integration med Django igennem. django_neomodelSamtidig forbliver den tæt på metallet: du kan altid skifte ned til rå Cypher, når ydeevne eller forespørgselskompleksitet kræver det.
Hvad neomodel er, og hvorfor det er vigtigt
Neomodel er en Object Graph Mapper til Neo4j-grafdatabasen, der bygger bro mellem Python-klasser og grafstrukturer. I stedet for manuelt at oprette noder og relationer via Cypher-strenge, definerer du Python-klasser, der repræsenterer dine domæneenheder, og neomodel omdanner dem til mærkede noder med indekserede egenskaber og begrænsninger i Neo4j. Det bygger oven på det officielle neo4j-python-driver, så dens opførsel er afstemt med, hvad du ville gøre direkte ved at bruge driveren.
Biblioteket fokuserer på en velkendt, klassebaseret modelleringsstil med robust arv, hooks og validering. Denne tilgang gør den særligt behagelig for udviklere, der er vant til Django ORM eller andre Python ORM'er: attributter på dine modelklasser svarer til egenskaber i Neo4j, mens særlige relationsfelter indfanger grafkanter. Med denne opsætning bliver grafgennemgang et spørgsmål om at følge attributter på objekter i stedet for at skrive en detaljeret Cypher hver gang.
Under motorhjelmen tilbyder neomodel en kraftfuld forespørgsels-API, der dækker almindelige grafadgangsmønstre uden at tvinge dig ind i rå Cypher med det samme. Du kan filtrere, sortere, gennemgå relationer, opdele nodesæt og udføre avancerede operationer via en Pythonic-grænseflade. Når det er nødvendigt, har du stadig adgang til en cypher_query hjælper til at udføre brugerdefinerede forespørgsler og arbejde direkte med de returnerede resultater.
En anden central funktion er skemahåndhævelse gennem kardinalitetsregler for relationer og egenskabsbegrænsninger. Ved at angive kardinalitet (f.eks. nul-eller-mere, en-eller-mere eller en) direkte på relationsfelter kan du håndhæve strukturelle forventninger i din graf og lade neomodel hjælpe dig med at undgå inkonsistente data. Indekser og begrænsninger oprettes automatisk baseret på modeldefinitioner, og der findes CLI-værktøjer til at anvende eller fjerne dem fra databasen på en kontrolleret måde.
Neomodel understøtter også fuldt ud transaktionelt arbejde og er sikkert at bruge i multi-threaded miljøer. Transaktioner kan åbnes og committes på en forudsigelig måde, og fordi indpakningen omkring den officielle driver bevidst er tynd, er performance-overheadet lille. Benchmarks med værktøjer som Locust viser, at neomodels abstraktionslag tilføjer minimal latenstid, selv under samtidig belastning.
Versionssupport, SemVer og konfiguration
Moderne neomodel-udgivelser følger semantisk versionsstyring (SemVer) ved hjælp af det klassiske major.minor.patch-mønster. Det betyder, at ændringer, der ikke fungerer korrekt, kun introduceres i forbindelse med større versionsopdateringer, at nye funktioner uden fejlfunktioner kommer som mindre udgivelser, og at fejlrettelser leveres som patchversioner. Denne versionsstrategi gør det nemmere at planlægge opgraderinger, især for produktionssystemer.
I 6.x-serien er neomodel rettet mod opdaterede Python- og Neo4j-versioner, så de matcher de fleste seriøse implementeringer, der kører. Specifikt kræver neomodel 6.x Python 3.10 eller nyere og understøtter Neo4j 5.x, Neo4j 4.4 LTS og den nyere Neo4j 2025.xx-linje. Både Neo4j Community, Neo4j Enterprise og Neo4j Aura (den hostede tjeneste) understøttes, hvilket giver dig fleksibilitet i, hvordan og hvor du hoster databasen.
For ældre miljøer dækker tidligere neomodel-grene stadig ældre Python- og Neo4j-kombinationer. 5.x-linjen understøtter Python 3.8+ med Neo4j 5.x og 4.4 (LTS), mens 4.x-linjen dækker Python 3.7 til 3.10 og Neo4j 4.x, inklusive 4.4 LTS, når neomodel 4.0.10 bruges. Denne kompatibilitetshistorie gør det muligt at migrere gradvist fremad, mens dine eksisterende opsætninger forbliver kørende.
Fra og med neomodel 6 håndteres konfigurationen via en moderne, typeannoteret dataklasse med runtime-validering og understøttelse af miljøvariabler. I stedet for spredte ad hoc-indstillinger valideres konfigurationsfelter ved opdatering, inklusive typekontroller og logiske begrænsninger. Miljøvariabler kan bruges til at tilsidesætte konfigurationen ubesværet, hvilket fungerer godt med containerbaserede implementeringer og cloud-miljøer.
6.0-udgivelsen introducerer også eksplicitte, brudte ændringer og adfærdsrettelser for at gøre API'en mere forudsigelig. For eksempel returnerer listeopløsning fra Cypher nu den forventede dybde: en forespørgsel som RETURN collect(node) vil kortlægge til results[0][0] i stedet for den tidligere, uintuitive results[0][0][0] struktur. Kardinalitetskontroller er strengere og aktiveret som standard, og flere separate hjælpefunktioner er flyttet til den centrale Database() og AsyncDatabase() singleton-klasser.
Installation og opsætning
Den anbefalede måde at installere neomodel på er direkte fra PyPI ved hjælp af din foretrukne pakkehåndtering. Du kan tilføje det til et virtuelt miljø med en simpel installationskommando og derefter administrere opgraderinger via dine sædvanlige afhængighedsværktøjer. Hvis du har brug for de allernyeste ændringer eller ønsker at bidrage, er det også muligt at installere direkte fra GitHub-arkivet.
Før du kører neomodel-kode, skal du konfigurere forbindelses-URL'en, så biblioteket ved, hvordan det kan nå din Neo4j-instans. Denne opsætning inkluderer typisk skemaet (Bolt eller Neo4j), vært, port, brugernavn, adgangskode og valgfrit databasenavn. For Django-projekter placeres denne konfiguration normalt i settings.py så den initialiseres, så snart applikationen starter.
Hvis din Neo4j-server er nyinstalleret, bør du ændre standardadgangskoden ved hjælp af Neo4j-browseren eller administrationspanelet. Som standard er dette panel tilgængeligt fra http://localhost:7474Når du har opdateret adgangskoden og bekræftet dbms.security.auth_enabled=true I databasekonfigurationen er du klar til at oprette forbindelse fra neomodel.
Til udvikling og testning er det almindeligt at bruge separate Neo4j-databaser og dedikerede legitimationsoplysninger. Neomodels egen testsuite forventer en Neo4j 4+ database og er afhængig af specifikke miljøvariabler for at oprette forbindelse. Hvis du kører testene på en helt ny database, vil testsuiten indstille adgangskoden til test Som standard; hvis den registrerer et eksisterende datasæt, nægter den at fortsætte, medmindre du eksplicit sender et nulstillingsflag, hvilket hjælper dig med at undgå utilsigtet datatab.
Når du vil teste neomodel på tværs af flere Python- og Neo4j-versioner, kan Docker og docker-compose orkestrere alt automatisk. Projektet tilbyder konfiguration til at generere en matrix af interpreterversioner og Neo4j-udgivelser, så integrationstests kan udføres ensartet. Dette er især nyttigt, hvis du bidrager med funktioner, der skal fungere på tværs af flere understøttede versioner.
Kernefunktioner: modeller, skema og indeks
Neomodels hjerte ligger i dets klassebaserede modeldefinitioner, der knytter sig direkte til Neo4j-nodenavne og -relationer. Du udleder typisk dine nodeklasser fra StructuredNodeog parforholdskurser fra StructuredRelNodefelter defineres ved hjælp af neomodel-specifikke egenskabstyper, som styrer, hvordan data gemmes og valideres i Neo4j.
Hver modelklasse bliver en label i Neo4j, og neomodel administrerer automatisk indekser og begrænsninger baseret på dine definitioner. Det betyder, at unikhed, nødvendige egenskaber og indekserede felter alle kan specificeres i Python uden manuelt at skulle oprette Cypher-kommandoerne til skemaoprettelse. Bag kulisserne oversætter neomodel dine modelmetadata til passende Neo4j-skemaoperationer.
Relationer er knyttet til nodeklasser ved hjælp af specielle deskriptorer som RelationshipTo, RelationshipFromog Relationship. Disse deskriptorer definerer relationstypen, kardinaliteten og gennemløbsretningen. RelationshipTo og RelationshipFrom udtrykke ensrettet navigation fra Pythons synspunkt, mens Relationship bruges når du vil behandle relationen som navigerbar i begge retninger fra koden, selvom Neo4j altid gemmer relationer med en retning.
Når relationer er logisk tovejs, anbefales det at undgå at oprette to spejlede felter og bruge et enkelt Relationship i stedet. Dette holder din model ren og konsistent, samtidig med at den tillader gennemgang i begge retninger i din Python-kode. Neo4j vil stadig gemme en rettet relation under motorhjelmen, men neomodels abstraktion skjuler denne detalje under gennemgang.
I scenarier, hvor nodestrukturer ikke er fuldt kendte på forhånd, tilbyder neomodel en SemiStructuredNode basisklasse. Klasser afledt af denne type kan indeholde "ad-hoc"-egenskaber, der ikke eksplicit er defineret i modellen. Dette er især praktisk, når dit grafskema udvikler sig ofte, eller når du har brug for at tilføje lejlighedsvise ekstra attributter uden at refaktorere modellen hver gang.
Kardinalitetsregler håndhæver antallet af tilladte relationer mellem noder og understøttes nu af strengere kontroller i neomodel 6. Bløde kardinalitetskontroller er tilgængelige for alle relationskardinaliteter, og streng kontrol er aktiveret som standard. Hvis dine data overtræder de konfigurerede relationsregler, vil neomodel afsløre problemet i stedet for lydløst at lade en inkonsekvent struktur fortsætte.
Automatisk skemastyring og -inspektion
Når du har defineret eller opdateret dine modeller, skal du anvende de tilsvarende begrænsninger og indekser på Neo4j-databasen. Neomodel leveres med et script kaldet neomodel_install_labels der scanner dine modeller og opretter eller opdaterer de nødvendige indekser og begrænsninger. Efter at have ændret dit skema, bør du køre dette script og gennemgå det rapporterede antal behandlede klasser for at bekræfte, at alt er synkroniseret.
Hvis du nogensinde har brug for at slette begrænsninger og indekser, der administreres af neomodel, er der en supplerende kommando kaldet neomodel_remove_labels. Dette script fjerner automatisk alle eksisterende begrænsninger og indekser, som neomodel tidligere har installeret. Det udskriver også det, der er blevet fjernet, så du tydeligt kan se virkningen af handlingen.
Begge skemastyringskommandoer understøtter en --db argument og standard til NEO4J_BOLT_URL miljøvariabel, når den ikke er angivet. Denne funktionsmåde hjælper med at holde legitimationsoplysninger og forbindelsesoplysninger ude af kommandolinjehistorikken og muliggør enkel konfiguration via miljøvariabler. Det gør det også nemmere at administrere automatisering og implementeringsscripts.
Ud over oprettelse af skemaer inkluderer neomodel et databaseinspektionsværktøj, der kan reverse engineere en eksisterende graf og generere en modelfil. Brug af inspect kommando (som kræver APOC-procedurer installeret i Neo4j), kan du scanne en database og producere en models.py fil under en målmappe som f.eks. yourappDen genererede fil indeholder importerede elementer, definitioner af nodeklasser og relationsdefinitioner, der matcher den detekterede grafstruktur.
Inspektionsprocessen kan justeres til store grafer ved at springe relationsegenskaber og kardinalitetsscanning over. For databaser med hundredtusindvis af noder og mere end en million relationer kan den fulde scanning tage snesevis af sekunder. Valgmuligheder som --no-rel-props og --no-rel-cardinality fremskynde tingene ved at udelade detaljeret analyse, stadig generere relationsfelter, men standardindstille kardinaliteten til en generisk værdi som ZeroOrMore.
Arbejde med neomodel Query API'en
Neomodels Query API giver dig mulighed for at udføre omfattende grafforespørgsler via Python-metoder på dine modelklasser i stedet for at skrive Cypher direkte. Hver model udsætter en .nodes en manager-lignende attribut, der repræsenterer et sæt noder med den tilsvarende etiket. Derfra kan du tælle, filtrere, sortere, opdele og hente de underliggende grafdata.
Opkald len(MyModel.nodes) udløser en Cypher-forespørgsel, der tæller noderne med den tilsvarende betegnelse MyModel. Dette tilbyder en intuitiv måde at få optællinger på uden at forlade Python-syntaksen. Hvis dit nodesæt allerede er filtreret, vil optællingen kun afspejle de noder, der matcher disse filtre, hvilket matcher den adfærd, du ville forvente af en typisk ORM.
Slicing understøttes direkte på nodesæt, hvilket er yderst nyttigt, når du vil arbejde med batchresultater. Udtryk som MyModel.nodes[0:10] returnerer et opdelt nodesæt, som du kan iterere over eller yderligere kæde med yderligere filtre. Udsnittet returnerer ikke en rå liste med det samme, men et andet nodesætobjekt, så du kan opbygge komplekse forespørgsler trin for trin.
Nodesæt understøtter iteration og booleske kontroller, selvom længde- og sandhedsoperationer er terminale. Når du har evalueret len() eller bruger et nodesæt i en boolsk kontekst, udløser du effektivt et evalueringstrin, der returnerer et konkret resultat i stedet for endnu et kædebart forespørgselsobjekt. Dette design balancerer Python-idiomer med den dovne natur af forespørgselsopbygning.
For at finde faktiske objekter bruger man typisk metoder som .all() og .get() på den .nodes Manager. Disse metoder kan modtage en lazy=True argument til kun at returnere node-ID'er i stedet for fulde objekter og alle deres egenskaber. Dette er nyttigt, hvis du vil minimere dataoverførsel eller udføre opfølgende forespørgsler manuelt baseret på ID'er.
Opret, opdater, slet og relationer
Det er lige så simpelt at oprette noder med neomodel som at instantiere din modelklasse og kalde den. save(). Når du har defineret dine egenskaber og standardværdier, kan du konstruere en instans med de ønskede feltværdier, kalde save, og neomodel vil oprette eller opdatere den tilsvarende node i Neo4j. Dette er analogt med, hvordan de fleste ORM'er håndterer persistens.
Opdatering af noder følger samme mønster: hent en instans, tildel nye værdier til dens attributter, og gem den igen. Neomodel sørger for at generere den rigtige Cypher til kun at ændre de ændrede egenskaber på den eksisterende node. Denne tilgang holder din kode ligetil og holder detaljerne i opdateringshandlinger ude af din forretningslogik.
Sletning af en node er også direkte: når du har en instans, kalder du dens delete() fremgangsmåde. Dette fjerner noden, og afhængigt af din relationskonfiguration og databasebegrænsninger kan det også fjerne tilknyttede relationer. Hooks før og efter sletning kan defineres for mere avanceret adfærd eller logføring.
Relationer mellem noder administreres via relationsfelter og bekvemmelighedsmetoder som f.eks. connect(). Når du har to noder, kan du kalde noget i retning af actor.movies.connect(movie) at oprette en passende relationsinstans i grafen. Relationsegenskaber kan modelleres via StructuredRel-baserede klasser, hvilket også giver dig plads til at gemme attributter på kanter.
Mere komplekse grafgennemgange kan opnås ved at følge relationsattributter eller kombinere forespørgselsfiltre på tværs af relationer. For eksempel kan du starte fra en Entity nodesæt, filtrer efter en egenskab, og gå derefter ud til relaterede noder for også at filtrere efter deres attributter. Dette opbygger gradvist en Cypher-forespørgsel under motorhjelmen, som neomodel udfører på dine vegne.
Async neomodel og transpiled sync API
Neomodel inkluderer asynkron understøttelse bygget oven på de asynkrone funktioner i den officielle Neo4j Python-driver. Det betyder, at du kan integrere Neo4j-operationer i moderne asynkrone Python-frameworks og -tjenester og dermed udnytte samtidighed fuldt ud til arbejdsbelastninger, der involverer mange I/O-bundne operationer.
Ydelsestest med værktøjer som Locust har vist, at asynkron neomodel, når den bruges samtidigt, overgår både serielle forespørgsler og samtidigt udførte synkrone neomodel-kald. Da mange grafoperationer involverer netværks-I/O og venten på databasesvar, giver det bedre gennemløb og ressourceudnyttelse at lade hændelsesløkken håndtere flere forespørgsler på én gang.
Internt holder neomodel async- og sync-API'erne justeret ved hjælp af et transpilationstrin, der konverterer async-kode til dens synkrone ækvivalent. Et dedikeret bibliotek bruges til automatisk at fjerne await nøgleord, omdøbe klasser (f.eks. fjerne Async præfikser) og udføre målrettede udskiftninger såsom at ændre adb til db or mark_async_test til mark_sync_testDenne tilgang undgår at opretholde to helt separate kodebaser.
Når du bidrager, arbejder du primært på den asynkrone implementering under neomodel/async_ og kør derefter det angivne transpilationsscript for at generere synkroniseringsvarianten. Du kan også bruge pre-commit hooks til at automatisere dette trin og sikre, at begge versioner forbliver synkroniserede. I mange tilfælde behøver din forretningslogik kun at blive skrevet én gang i det asynkrone lag.
Nogle funktioner er muligvis kun beregnet til asynkron eller kun til synkroniseringsbrug, og neomodel eksponerer et værktøjsmønster (inspireret af den officielle Neo4j-driver) for at adskille disse kodestier. Dette giver dig mulighed for at definere adfærd, der adskiller sig mellem de to tilstande, samtidig med at din overordnede API-overflade forbliver sammenhængende. Testmoduler, såsom dem der dækker match-API'en, demonstrerer, hvordan asynkron kode transpileres, og hvordan den resulterende synkroniseringskode opfører sig.
Database- og AsyncDatabase-singletoner
I neomodel 6, den Database() og AsyncDatabase() Klasser implementeres som ægte singletoner for at tydeliggøre, hvordan globale operationer håndteres. I stedet for at sprede enkeltstående hjælpefunktioner grupperer neomodel nu databaseomfattende operationer i disse singleton-instanser, hvilket gør API'en mere synlig og konsistent.
Flere ældre funktioner blev flyttet ind i Database() klasse og fjernet fra det globale navnerum. Eksempler indbefatter change_neo4j_password, clear_neo4j_database, drop_constraints, drop_indexes, remove_all_labels, install_labelsog install_all_labelsDe asynkrone modparter er tilgængelige fra AsyncDatabase() singleton, normalt omtalt som adb i den asynkrone kontekst.
Dette redesign forenkler mentale modeller omkring operationer på databaseniveau og undgår tvetydighed i, hvordan konfiguration og global tilstand håndteres. Ved at sikre, at både synkroniserings- og asynkroniseringstilstande deler en lignende struktur, bliver det også nemmere at ræsonnere over, hvornår man sikkert kan skifte fra den ene tilgang til den anden eller køre dem side om side i forskellige dele af en større applikation.
Derudover introducerede 6.0-udgivelsen en merge_by parameter til batchoperationer, hvilket giver mere kontrol over, hvordan noder og relationer flettes sammen. Du kan tilpasse, hvilke etiketter og egenskabsnøgler der definerer entydighed for batchfletninger, hvilket er afgørende, når du håndterer store mængder dataindtagelse eller synkroniseringsopgaver.
Django-integration og brug i den virkelige verden
Neomodel integrerer problemfrit med Django via django_neomodel pakke, der gør det muligt for dig at behandle dine grafmodeller som en del af et Django-projekt. Med denne integration findes konfigurationen typisk i settings.py, og dine node- og relationsklasser sameksisterer med resten af dit Django-økosystem, herunder apps, middleware og views.
Et konkret eksempel er en Django-tutorial i flere dele, der bruger neomodel til at udforske og søge i en grafdatabase i Paradise Papers-stil. I de første dele konfigurerer du Django-projektet og integrerer neomodel; i senere dele bygger du en fetch_api app, definere modeller, der afspejler enheder, relationer og egenskaber i grafen, og derefter gradvist opbygge værktøjer og visninger oven på dem.
Inden for et sådant projekt kan du bruge neomodel-modeller direkte i Django-visninger, serialiseringsprogrammer eller hjælpemoduler. En almindelig tilgang er at skabe en utils.py fil, hvor du definerer bekvemmelighedsfunktioner, der kalder ind i Query API'en. For eksempel kan du implementere count_nodes, fetch_nodesog fetch_node_details hjælpere, der dynamisk indtager filtre, paginationsparametre og modelnavne.
Nogle data, såsom lister over lande, jurisdiktioner eller datakilder, kan være dyre at forespørge gentagne gange, så du kan forudberegne dem ved hjælp af rå Cypher og gemme dem som konstanter. A constants.py Modulet kan udføre disse Cypher-forespørgsler én gang, udlede sorterede lister som COUNTRIES, JURISDICTIONSog DATASOURCE, og gør dem nemme at importere på tværs af din Django-app.
For at sikre at disse konstanter er klar ved applikationens opstart, kan du koble dig til Djangos appkonfiguration ved at definere en ready() metode i fetch_api/app.py. Inde i den metode importerer du constants.py, som udløser de indledende Cypher-forespørgsler og udfylder de tilsvarende lister. På denne måde kan efterfølgende anmodninger blot læse fra de allerede forberedte datastrukturer.
Raw Cypher vs. OGM til komplekse forespørgsler
Selvom neomodels OGM er ideel til hverdagsbrug af CRUD og relationsgennemgang, er der scenarier, hvor manuelt skrevne Cypher-forespørgsler er mere effektive. Dybt indlejrede traversaler, andengrads- eller multi-hop-forespørgsler og sofistikerede aggregeringer kan nogle gange udtrykkes tydeligere og med bedre ydeevne som rå Cypher end som OGM-kæder.
Et typisk eksempel er at finde medskuespillere, der har medvirket i en film sammen med en bestemt skuespiller, såsom at bestemme alle personer, der har arbejdet med Tom Hanks. Som en Cypher-forespørgsel kan dette være ret direkte: du matcher skuespilleren, navigerer til de film, de medvirkede i, og navigerer derefter til andre skuespillere i disse film, idet du anvender filtre og aggregeringer efter behov. Resultatet er et præcist, optimeret grafmønster.
At replikere den samme adfærd udelukkende via OGM-bekvemmelighedsmetoder kan kræve en O(n²)-lignende proces, der looper over film og relaterede aktører på Python-niveau. Dette er både mindre elegant og mindre effektivt end at lade Neo4j håndtere det tunge arbejde i en enkelt Cypher-sætning. Det illustrerer, at OGM'er ikke er en mirakelkur til ethvert grafadgangsmønster.
Desuden kan formen på de returnerede data blive ret kompleks, når du bruger OGM-operationer til dybe gennemløb. Den genererede Cypher vil ofte indeholde startnoden, mellemliggende relationer, nabonoder og deres relationer. Dette kan være gavnligt, når du har brug for omfattende kontekst, men det kan være overdrevet, når du kun ønsker specifikke aggregerede resultater eller en delmængde af egenskaber.
I situationer hvor ydeevne og klarhed er altafgørende, brug cypher_query direkte at udføre håndlavede Cypher kan være den bedre løsning. Neomodel gør denne flugtluge bevidst: du kan blande og matche OGM-interaktioner på højt niveau med Cypher på lavt niveau i det samme projekt og vælge det rigtige værktøj til hver enkelt forespørgsel, samtidig med at modellerne bevares som den eneste sandhedskilde for dit skema.
Neomodel i Neo4j Labs og projektstyring
Neomodels overgang til Neo4j Labs-programmet formaliserede dets status som et aktivt vedligeholdt, fællesskabsdrevet projekt med klare kvalitetsforventninger. Neo4j Labs fungerer som hjemsted for eksperimentelle og avancerede projekter, der har reel fremdrift, men som ikke er en del af kerneproduktet. Mange kendte værktøjer, såsom grafdatavidenskabelige komponenter, GraphQL-biblioteket, APOC-kernen og streamingintegrationer, har rødder i dette program.
At være en del af Neo4j Labs betyder, at neomodel overholder grundlæggende standarder omkring test, sikkerhedstjek og automatiserede værktøjer som CI/CD-pipelines. Vedligeholdelsesteamet kører integrationstests mod en bred matrix af Python- og Neo4j-versioner og sikrer kompatibilitet, når nye udgivelser kommer ud. Dette er en del af grunden til, at neomodel kan gøre krav på fuld understøttelse af alle aktuelt understøttede Python- og Neo4j-versioner, både Community og Enterprise.
Projektet forbliver fuldt open source og community-centreret, med GitHub som det primære knudepunkt for problemer, diskussioner og bidrag. Problemloggen er endnu engang aktivt kurateret, hvor ældre elementer triages og opsummeres, når tiden tillader det, mens diskussionsområdet er åbent for alle og bruges til annonceringer og designsamtaler. Der er mindst én Neo4j-medarbejder, der fungerer som vedligeholder og forbinder felterfaring tilbage til projektet.
Produktionsimplementeringer i den virkelige verden, såsom OpenStudyBuilder fra Novo Nordisk, spiller en vigtig rolle i at udforme neomodels køreplan. Disse storstilede, virkelige applikationer leverer konkrete krav og feedback, der omsættes til nye funktioner og forbedringer, som bidrages tilbage til fællesskabet. Denne positive løkke viser, hvordan virksomhedsbrug og open source-udvikling kan forstærke hinanden.
Med sin Pythoniske modellering, stærke Neo4j-justering, async- og sync-API'er og aktive Lab-understøttede udvikling tilbyder neomodel en overbevisende måde at arbejde med grafer fra Python i både små projekter og krævende produktionssystemer. Brugt med omtanke – ved at læne sig op ad OGM til klar domænemodellering og typiske grafinteraktioner, og ved at række ud efter rå Cypher, når komplekse mønstre eller ydeevne kræver det – kan det betydeligt forenkle, hvordan du designer, forespørger og vedligeholder grafbaserede applikationer.