RDFLib

RDFLib
Utvecklare Daniel Krech (skapare), Gunnar Grimnes, Joern Hees (tidigare underhållare), Nicholas J. Car (underhållare)
Initial release 4 juni 2002 ; 20 år sedan ( 2002-06-04 )
Stabil frisättning
6.2.0 / 16 juli 2022 ; 7 månader sedan ( 2022-07-16 )
Förvar
Skrivet i Pytonorm
Operativ system Cross-platform
Typ Bibliotek
Licens BSD
Hemsida rdflib .dev  Edit this on Wikidata

RDFLib är ett Python- bibliotek för att arbeta med RDF , ett enkelt men kraftfullt språk för att representera information. Det här biblioteket innehåller tolkare/serialiserare för nästan alla kända RDF-serialiseringar, såsom RDF/XML, Turtle, N-Triples och JSON-LD, av vilka många nu stöds i sin uppdaterade form (t.ex. Turtle 1.1). Biblioteket innehåller också både i minnet och beständiga Graph -backends för lagring av RDF-information och många bekvämlighetsfunktioner för att deklarera grafnamnrymder, skicka in SPARQL -frågor och så vidare. Den är i kontinuerlig utveckling med den senaste stabila utgåvan, rdflib 6.1.1 som släpptes den 20 december 2021. Den skapades ursprungligen av Daniel Krech med den första utgåvan i november 2002.

Ett antal andra Python-projekt använder rdflib för RDF-manipulation, inklusive:

Historik och status

Översikt

RDFLib och Python idiom

RDFLibs användning av olika Python- idiom betyder att det är ganska enkelt för programmerare med endast junior Python-kunskaper att manipulera RDF. Å andra sidan är Python-idiomen enkla nog att någon som är bekant med RDF, men inte Python, förmodligen kan komma på hur man använder rdflib ganska enkelt.

Kärnklassen i RDFLib är Graph som är en Python-ordbok som används för att lagra samlingar av RDF-trippel i minnet. Den omdefinierar vissa inbyggda Python-objektmetoder för att uppvisa enkelt grafbeteende, såsom enkel grafsammanfogning via addition (dvs. g3 = g1 + g2 ) .

RDFLib-grafer efterliknar behållartyper och är bäst att tänka på som en uppsättning av 3-objekt trippel:

set([ (ämne,predikat,objekt), (ämne1,predikat1,objekt1), ... (ämneN,predikatN,objektN) ])

RDFLib-grafer är inte sorterade behållare; de har vanliga Python-uppsättningsoperationer, t.ex. add() -metoder som söker tripplar och returnerar dem i godtycklig ordning.

RDF-graftermer

Följande RDFLib-klasser (listade nedan) modellerar RDF-termer i en graf och ärver från en gemensam Identifier- klass, som utökar Python unicode. Förekomster av dessa är noder i en RDF-graf.

Namnutrymmesverktyg

RDFLib tillhandahåller mekanismer för att hantera namnrymder. I synnerhet finns det en Namespace- klass som tar (som sitt enda argument) namnutrymmets Bas-URI. Fullständigt kvalificerade URI:er i namnområdet kan konstrueras genom attribut-/ordboksåtkomst på namnområdesinstanser:

   
  



 >>>  från  rdflib  importera  Namnutrymme  >>>  SDO  =  Namnområde  (  "https://schema.org/"  )  >>>  SDO  .  Person  https://schema.org/Person  >>>  SDO  [  'url'  ]  https://schema.org/url 

Grafer som iteratorer

RDFLib-grafer åsidosätter också __ iter __ för att stödja iteration över de inneslutna tripplarna:

     
           för  subject  ,  predicate  ,  object_  in  someGraph  :  hävda  (  subject  ,  predicate  ,  object_  )  i  someGraph  ,  "Iterator/Container Protocols are bruten!!" 

Ställ in operationer på RDFLib-grafer

__ iadd __ och __ isub __ åsidosätts för att stödja addering och subtrahering av grafer till/från varandra (på plats):

  • G1 += G1
  • G2 -= G2

Grundläggande trippelmatchning

RDFLib-grafer stöder grundläggande trippelmönstermatchning med en trippelfunktion (( subjekt , predikat , objekt )). Denna funktion är en generator av trippel som matchar mönstret som ges av argumenten. Argumenten för dessa är RDF-termer som begränsar de trippel som returneras. Termer som är Inga behandlas som ett jokertecken.

       
        för  subjekt  ,  predikat  ,  objekt_  i  someGraph  .  tripplar  ((  None  ,  URIRef  (  "https://schema.org/name"  ),  None  )):  print  (  "  {}  har namn  {}  "  .  format  (  s  ,  o  ))  # skriver ut alla trippel med predikatet är https://schema.org/name 

RDF-bekvämlighets-API:er (RDF-samlingar/behållare)

Hantera trippel

Lägger till trippel

Trippel kan läggas till på två sätt:

  • De kan läggas till med funktionen parse ( source , publicID = None , format = "xml"). Det första argumentet kan vara en källa av många slag, men det vanligaste är serialiseringen (i olika format: RDF/XML, Notation 3 , N-trippel av en RDF-graf som en sträng). Formatparametern är en av turtle, n3, xml, n-triples eller JSON -LD (denna sista när JSON-LD plugin används). publicID är namnet på grafen som RDF-serialiseringen kommer att analyseras till.
  • Trippel kan också läggas till med add -funktionen: add (( subjekt , predikat , objekt )).

Ta bort trippel

På liknande sätt kan trippel tas bort genom ett anrop att ta bort : remove (( subjekt , predikat , objekt ))

RDF bokstavligt stöd

RDFLib 'Literal's beter sig i huvudsak som Unicode-tecken med en XML Schema- datatyp eller språkattribut. Klassen tillhandahåller en mekanism för att både konvertera Python-literals (och deras inbyggda funktioner som tid/datum/datumtid) till motsvarande RDF-literals och (omvänt) konvertera Literals till deras Python-motsvarighet. Det finns visst stöd för att överväga datatyper vid jämförelse av Literal-instanser, implementerad som en åsidosättning till __ eq __. Denna mappning till och från Python-literaler uppnås med följande ordböcker:

  
       
            
              
              
             
              
              
          
 PythonToXSD  =  {  basestring  :  (  None  ,  None  ),  float  :  (  None  ,  XSD_NS  +  u  'float'  ),  int  :  (  None  ,  XSD_NS  +  u  'int'  ),  long  :  (  None  ,  XSD_NS  +  u  'long'  ),  bool  :  (  Ingen  ,  XSD_NS  +  u  'boolean'  ),  datum  :  (  lambda  i  :  i  .  isoformat  (),  XSD_NS  +  u  'datum'  ),  tid  :  (  lambda  i  :  i  .  isoformat  (),  XSD_NS  +  u  'tid '  ),  datetime  :  (  lambda  i  :  i  .  isoformat  (),  XSD_NS  +  u  'dateTime'  ),  } 

Mappar Python-instanser till WXS-datatypade Literals

   
                     
                     
                  
                   
         
                    
                 
                     
                  
                  
       
                     
       
          
                      
             
          
                    
              
                     
            
             
                    
                   
             
                  
 XSDToPython  =  {  XSD_NS  +  u  'time'  :  (  None  ,  _strToTime  ),  XSD_NS  +  u  'date'  :  (  None  ,  _strToDate  ),  XSD_NS  +  u  'dateTime'  :  (  None  ,  _strToDateTime  ),  XSD_NS  +  u  'string'  :  (  None  ,  None  ),  XSD_NS  +  u  'normalizedString'  :  (  None  ,  None  ),  XSD_NS  +  u  'token'  :  (  None  ,  None  ),  XSD_NS  +  u  'language'  :  (  None  ,  None  ),  XSD_NS  +  u  'boolean'  :  (  Inga  ,  lambda  i  :  i  .  lägre  ()  i  [  '1'  ,  'sant'  ]),  XSD_NS  +  u  'decimal'  :  (  flytande  ,  Inget  ),  XSD_NS  +  u  'heltal'  :  (  långt  ,  Inget  ),  XSD_NS  +  u  'nonPositiveInteger'  :  (  int  ,  None  ),  XSD_NS  +  u  'long'  :  (  long  ,  None  ),  XSD_NS  +  u  'nonNegativeInteger'  :  (  int  ,  None  ),  XSD_NS  +  u  'negativeInteger'  :  (  int  ,  None  ),  XSD_NS  +  u  'int'  :  (  int  ,  None  ),  XSD_NS  +  u  'unsignedLong'  :  (  long  ,  None  ),  XSD_NS  +  u  'positiveInteger'  :  (  int  ,  None  ),  XSD_NS  +  u  'short'  :  (  int  ,  None  ),  XSD_NS  +  u  'unsignedInt'  :  (  long  ,  None  ),  XSD_NS  +  u  'byte'  :  (  int  ,  None  ),  XSD_NS  +  u  'unsignedShort'  :  (  int  ,  None  ),  XSD_NS  +  u  'unsignedByte'  :  (  int  ,  None  ),  XSD_NS  +  u  'float'  :  (  float  ,  None  ),  XSD_NS  +  u  'double'  :  (  float  ,  None  ),  XSD_NS  +  u  'base64Binary'  :  (  base64  .  decodestring  ,  None  ),  XSD_NS  +  u  'anyURI'  :  (  None  ,  None  ),  } 

Mappar WXS-datatypade Literals till Python. Denna mappning används av toPython () som definieras på alla Literal-instanser.

SPARQL frågar

RDFLIb stöder en majoritet av den nuvarande SPARQL 1.1- specifikationen och inkluderar en sele för den allmänt tillgängliga RDF DAWG-testsviten. Stöd för SPARQL tillhandahålls på två sätt:

  • rdflib.graph.query() - används för att ställa SPARQL SELECT- eller ASK -frågor till en graf (eller Store av grafer )
  • rdflib.graph.update() - används för att ändra grafinnehåll eller returnera RDF med INSERT , DELETE och CONSTRUCT SPARQL-satser

Serialisering (NTrippel, N3 och RDF/XML)

RDF Store API

Ett universellt RDF Store-gränssnitt

Detta dokument försöker sammanfatta några grundläggande komponenter i en RDF-butik. Motivationen är att skissera en standarduppsättning av gränssnitt för att tillhandahålla det nödvändiga stödet som behövs för att bevara en RDF-graf på ett sätt som är universellt och inte bundet till någon specifik implementering. För det mesta följs den grundläggande RDF-modellen såväl som terminologi som överensstämmer med RDF-modellens specifikationer. Men detta föreslagna gränssnitt utökar också ett RDF-lager med ytterligare krav som är nödvändiga för att underlätta aspekterna av Notation 3 som går utöver RDF-modellen för att tillhandahålla ett ramverk för First Order Predicate Logic-bearbetning och persistens.

Terminologi
Kontext
En namngiven, oordnad uppsättning påståenden. Kan också kallas en undergraf. De namngivna graferna litteratur och ontologi är relevanta för detta koncept. Ett sammanhang kan endast ses som förhållandet mellan en RDF-trippel och en undergraf (det är så termen sammanhang används på sidan Notation 3 Design Issues) där den finns eller själva undergrafen.
Det är värt att notera att konceptet att logiskt gruppera tripplar inom en adresserbar "uppsättning" eller "subgraf" ligger knappt utanför RDF-modellens räckvidd. RDF-modellen definierar en graf som en godtycklig samling av trippel och semantiken för dessa trippel, men ger ingen vägledning om hur man konsekvent hanterar sådana godtyckliga samlingar. Även om en samling av trippel kan ses som en resurs i sig, täcks inte associationen mellan en trippel och samlingen den är en del av.
Konjunktivdiagram
Detta hänvisar till grafen på "toppnivå". Det är aggregeringen av alla sammanhang inom den och är också den lämpliga, absoluta gränsen för slutna världsantaganden/modeller. Denna distinktion är den lättillgängliga delen av RDF längs vägen till den semantiska webben och det mesta av dess värde ligger i (företags/företag) verkliga problem: Det finns åtminstone
två situationer där antagandet om sluten värld används. Den första är där det antas att en kunskapsbas innehåller alla relevanta fakta. Detta är vanligt i företagsdatabaser. Det vill säga att informationen den innehåller antas vara fullständig
Ur ett butiksperspektiv ger sluten världsantaganden också fördelen av bättre svarstider för frågor på grund av de explicita stängda världsgränserna. Stängda världsgränser kan göras transparenta av federerade frågor som antar att varje ConjunctiveGraph är en del av ett större, obegränsat universum. Så ett sluten världsantagande utesluter dig inte från ett antagande i en öppen värld .
För beständighetens skull måste konjunktiva grafer särskiljas med identifierare (som inte nödvändigtvis är RDF-identifierare eller kan vara en RDF-identifierare normaliserad - SHA1/MD5 kanske - för databasnamnsändamål) som kan refereras för att indikera konjunktiva frågor (gjorda frågor över hela konjunktivdiagrammet) eller visas som noder i hävdade uttalanden. I det senare fallet skulle sådana uttalanden kunna tolkas som att de gjorts om hela det "kända" universum. Till exempel:
  

  

   <urn:uuid:conjunctive-graph-foo>  rdf  :  typ  :  ConjunctiveGraph  <urn:uuid:conjunctive-graph-foo>  rdf  :  typ  logg  :  Sanning  <urn:uuid:conjunctive-graph-foo>  :  persistedAv  :  MySQL 
Citerat uttalande
Ett uttalande som inte hävdas men som refereras till på något sätt. Oftast händer detta när vi vill göra ett påstående om ett annat påstående (eller en uppsättning påståenden) utan att nödvändigtvis säga att dessa citerade påståenden (är sanna). Till exempel:

Chimezie sa "påståenden av högre ordning är komplicerade"

Vilket kan skrivas som (i N3):
     :  chimezie  :  sa  {:  higherOrderStatements  rdf  :  typ  :  komplicerat  } 
Formel
Ett sammanhang vars påståenden är citerade eller hypotetiska.
Sammanhangscitat kan ses som mycket likt tingsliggörande. Den största skillnaden är att citerade uttalanden inte hävdas eller betraktas som sanningsutsagor om universum och kan refereras till som en grupp: en hypotetisk RDF-graf
Universella kvantifierare/variabler. (relevanta referenser):
  • OWL Definition av SWRL. (bläddra)
  • SWRL/RuleML-variabel
Villkor
Termer är den typ av objekt som kan förekomma i en citerad/påstådd trippel. Detta inkluderar de som är kärnan i RDF:
  • Tomma noder
  • URI-referenser
  • Literals (som består av ett bokstavligt värde, datatyp och språktagg)
De som utökar RDF-modellen till N3:
  • Formler
  • Universella kvantifieringar (variabler)
Och de som främst är avsedda för matchning mot "Noder" i den underliggande grafen:
  • REGEX-uttryck
  • Datumintervall
  • Numeriska intervall
Noder
Noder är en delmängd av Villkoren som den underliggande butiken faktiskt kvarstår. Uppsättningen av sådana villkor beror på om butiken är formelmedveten eller inte. Butiker som inte är formelmedvetna skulle bara bevara dessa termer som är kärnan i RDF-modellen, och de som är formelmedvetna skulle också kunna bevara N3-tilläggen. Emellertid kommer verktygstermer som endast tjänar syftet att matcha noder med termmönster förmodligen bara vara termer och inte noder.
"Sammansättningen av noder i en RDF-graf är uppsättningen av subjekt och objekt av trippel i grafen.
Kontextmedveten
En RDF-lagring som kan lagra uttalanden i sammanhang anses vara kontextmedveten. I huvudsak kan en sådan lagring partitionera RDF-modell som den representerar i individuella, namngivna och adresserbara underdiagram
Formelmedveten
Ett RDF-lager som kan skilja mellan uttalanden som hävdas och uttalanden som citeras anses formelmedvetet.
En sådan butik är ansvarig för att upprätthålla denna separation och se till att frågor mot hela modellen (sammanställningen av alla sammanhang - specificerad genom att inte begränsa en "fråga" till ett specifikt namnkontext) inte inkluderar citerade uttalanden. Det är också ansvarigt för att särskilja universella kvantifierare (variabler). Dessa
2 ytterligare begrepp (formler och variabler) måste ses som kärnutvidgningar och särskiljas från de andra termerna för en trippel (åtminstone för uthållighetens tur och retur). Det är värt att notera att "omfattningen" av universella kvantifierare (variabler) och existentiella kvantifierare (BNodes) är formeln (eller kontexten - för att vara specifik) i vilken deras uttalanden finns. Utöver detta beter sig en Formula-medveten butik på samma sätt som en kontextmedveten butik.
Konjunktiv fråga
En fråga som inte begränsar butiken till att endast söka inom ett namngivet sammanhang. En sådan fråga förväntar sig att en kontextmedveten butik söker igenom hela det påstådda universum (konjunktivdiagrammet). En formelmedveten butik förväntas inte inkludera citerade uttalanden när de matchar en sådan fråga.
N3 Round Trip
Detta hänvisar till kraven på en formelmedveten RDF-butiks uthållighetsmekanism som krävs för att den ska fyllas ordentligt med en N3-parser och renderas som syntax av en N3-serialiserare.
Transaktionslagring
Ett RDF-lager som kan tillhandahålla transaktionsintegritet till de RDF-operationer som utförs på den.
Tolka syntax

Följande Notation 3-dokument:

        {  ?x  a  :  N3Programmer  }  =>  {  ?x  :  har  [  a  :  migrän  ]} 

Kan orsaka att följande uttalanden hävdas i butiken:

   _  :  en  logg  :  innebär  _  :  b 

Detta uttalande skulle hävdas i partitionen som är associerad med citerade uttalanden (i en formel som heter _:a)

   ?x  rdf  :  typ  :  N3Programmer 

Slutligen skulle dessa uttalanden hävdas i samma partition (i en formel som heter _:b)

  

   ?x  :  har  _  :  c  _  :  c  rdf  :  typ  :  Migrän 

Formler och variabler som villkor

Formler och variabler kan särskiljas från URI-referenser, Literals och BNodes med följande syntax:

    
       {  ..  }  -  Formel  ?x  -  Variabel 

De måste också vara särskiljbara i uthållighet för att säkerställa att de kan snubblas tur och retur. Andra frågor om beständigheten av N3-termer.

Databashantering

En RDF-butik bör tillhandahålla standardgränssnitt för hantering av databasanslutningar. Sådana gränssnitt är standard för de flesta databashanteringssystem (Oracle, MySQL, Berkeley DB, Postgres, etc..) Följande metoder är definierade för att tillhandahålla denna funktion:

  • def open(self, configuration, create=True) - Öppnar arkivet som anges av konfigurationssträngen. Om skapa är sant kommer en butik att skapas om den inte redan finns. Om skapa är False och en butik inte redan existerar uppstår ett undantag. Ett undantag tas också upp om det finns en butik men det inte finns tillräckliga behörigheter för att öppna butiken.
  • def close(self, commit_pending_transaction=False) - Detta stänger databasanslutningen. Parametern commit_pending_transaction anger om alla väntande transaktioner ska utföras innan stängning (om butiken är transaktionsbaserad).
  • def destroy(self, configuration) - Detta förstör instansen av arkivet som identifieras av konfigurationssträngen.

Konfigurationssträngen förstås av butiksimplementeringen och representerar alla nödvändiga parametrar som behövs för att lokalisera en individuell instans av en butik. Detta kan likna en ODBC-sträng, eller i själva verket vara en ODBC-sträng om anslutningsprotokollet till den underliggande databasen är ODBC. Den öppna funktionen måste misslyckas intelligent för att tydligt uttrycka att ett lager (identifierad av den givna konfigurationssträngen) redan existerar eller att det inte finns något lager (på den plats som anges av konfigurationssträngen) beroende på värdet på create.

Tredubbla gränssnitt

En RDF-butik skulle kunna tillhandahålla en standarduppsättning gränssnitt för manipulering, hantering och/eller hämtning av dess inneslutna tripplar (påstådda eller citerade):

  • def add(self, (subjekt, predikat, objekt), context=None, quoted=False) - Lägger till det givna påståendet till ett specifikt sammanhang eller till modellen. Det citerade argumentet tolkas av formelmedvetna butiker för att indikera att detta påstående är citerat/hypotetiskt. Det bör vara ett fel att inte ange ett sammanhang och att det citerade argumentet ska vara sant. Det bör också vara ett fel för det citerade argumentet att vara True när butiken inte är formelmedveten.
  • def remove(själv, (subjekt, predikat, objekt), sammanhang)
  • def triples(self, (subjekt, predikat, objekt), context=None) - Returnerar en iterator över alla trippel (inom konjunktivgrafen eller bara det givna sammanhanget) som matchar det givna mönstret. Mönstret specificeras genom att tillhandahålla explicita uttalandetermer (som används för att matcha mot noder i det underliggande lagret), eller None - vilket indikerar ett jokertecken. OBS: Det här gränssnittet förväntas returnera en iterator av tupler med längd 3, motsvarande de 3 termerna för matchande uttalanden, som kan vara antingen: URIRef, Blank Node, Literal, Formel, Variabel eller (kanske) en Context.

Denna funktion kan ses som den primära mekanismen för att producera trippel med noder som matchar motsvarande termer och termmönster som tillhandahålls. En konjunktiv fråga kan indikeras genom att antingen tillhandahålla värdet NULL/None/Empty strängvärde för kontext eller identifieraren som är associerad med konjunktivdiagrammet.

  • def __len__(self, context=None) - Antal uttalanden i butiken. Detta bör endast ta hänsyn till icke-citerade (påstådda) påståenden om sammanhanget inte är specificerat, annars bör det returnera antalet påståenden i den angivna formeln eller kontexten.
Formel/kontextgränssnitt

Dessa gränssnitt fungerar omväxlande med sammanhang och formler (för butiker som är formelmedvetna).

  • def contexts(self, triple=None) - Generator över alla sammanhang i grafen. Om trippel anges, en generator över alla sammanhang som trippeln befinner sig i.
  • def remove_context(själv, identifierare) -

Namngivna grafer / konjunktiva grafer

RDFLib definierar följande typer av grafer:

  • 'Graph'(_ lagra _,_ identifierare _)
  • 'QuotedGraph'(_ lagra _,_ identifierare _)
  • 'ConjunctiveGraph'(_ store _,_ default _ identifier _= None )

En konjunktiv graf är den mest relevanta samlingen av grafer som anses vara gränsen för antaganden om sluten värld . Denna gräns är ekvivalent med den för butiksinstansen (som i sig är unikt identifierad och skild från andra instanser av Store som betecknar andra konjunktiva grafer). Den är likvärdig med alla namngivna grafer i den och associerad med en _default_-graf som automatiskt tilldelas en BNode för en identifierare - om någon inte ges.


Formler

RDFLib-grafer stöder ytterligare en utökning av RDF-semantik för formler. För den akademiskt lagda är Graham Klynes "formella" förlängning (se externa länkar) förmodligen bra att läsa.

Formler representeras formellt av klassen "QuotedGraph" och skiljer sig från vanliga RDF-grafer genom att deras uttalanden citeras.

Uthållighet

RDFLib tillhandahåller ett abstraherat Store API för beständighet av RDF och Notation 3 . Klassen Graph fungerar med instanser av detta API (som det första argumentet till dess konstruktor) för trippelbaserad hantering av en RDF-butik inklusive: sophämtning, transaktionshantering, uppdatering, mönstermatchning, borttagning, längd och databashantering ( _ open _ / _ stäng _ / _ förstöra _ ) . Ytterligare beständighetsmekanismer kan stödjas genom att implementera detta API för en annan butik. Databaser som stöds för närvarande:

Butiksinstanser kan skapas med plugin -funktionen:

   
   
       från  rdflib  import  plugin  från  rdflib.store  import  butik  plugin  .  get  ( '   ..  en av de stödda butikerna ..' ,  Store  )  (  identifierare  =..  id  för  konjunktivgraf  ..  ) 

Idiom av högre ordning

Det finns några API:er på hög nivå som utökar RDFLib-grafer till andra pytoniska idiom. För mer explicit Python-bindning finns Sparta , SuRF & FunOWL .

externa länkar