.. _gettingstarted: =============================== Getting started with RDFLib =============================== Installation ============ RDFLib is open source and is maintained in a `GitHub `_ repository. RDFLib releases, current and previous, are listed on `PyPi `_ The best way to install RDFLib is to use ``pip`` (sudo as required): .. code-block :: bash $ pip install rdflib If you want the latest code to run, clone the ``main`` branch of the GitHub repo and use that or you can ``pip install`` directly from GitHub: .. code-block :: bash $ pip install git+https://github.com/RDFLib/rdflib.git@main#egg=rdflib Support ======= Usage support is available via questions tagged with ``[rdflib]`` on `StackOverflow `__ and development support, notifications and detailed discussion through the rdflib-dev group (mailing list): http://groups.google.com/group/rdflib-dev If you notice an bug or want to request an enhancement, please do so via our Issue Tracker in Github: ``_ How it all works ================ *The package uses various Python idioms that offer an appropriate way to introduce RDF to a Python programmer who hasn't worked with RDF before.* The primary interface that RDFLib exposes for working with RDF is a :class:`~rdflib.graph.Graph`. RDFLib graphs are un-sorted containers; they have ordinary Python ``set`` operations (e.g. :meth:`~rdflib.Graph.add` to add a triple) plus methods that search triples and return them in arbitrary order. RDFLib graphs also redefine certain built-in Python methods in order to behave in a predictable way. They do this by `emulating container types `_ and are best thought of as a set of 3-item tuples ("triples", in RDF-speak): .. code-block:: text [ (subject0, predicate0, object0), (subject1, predicate1, object1), ... (subjectN, predicateN, objectN) ] A tiny example ============== .. code-block:: python from rdflib import Graph # Create a Graph g = Graph() # Parse in an RDF file hosted on the Internet g.parse("http://www.w3.org/People/Berners-Lee/card") # Loop through each triple in the graph (subj, pred, obj) for subj, pred, obj in g: # Check if there is at least one triple in the Graph if (subj, pred, obj) not in g: raise Exception("It better be!") # Print the number of "triples" in the Graph print(f"Graph g has {len(g)} statements.") # Prints: Graph g has 86 statements. # Print out the entire Graph in the RDF Turtle format print(g.serialize(format="turtle")) Here a :class:`~rdflib.graph.Graph` is created and then an RDF file online, Tim Berners-Lee's social network details, is parsed into that graph. The ``print()`` statement uses the ``len()`` function to count the number of triples in the graph. A more extensive example ======================== .. code-block:: python from rdflib import Graph, Literal, RDF, URIRef # rdflib knows about quite a few popular namespaces, like W3C ontologies, schema.org etc. from rdflib.namespace import FOAF , XSD # Create a Graph g = Graph() # Create an RDF URI node to use as the subject for multiple triples donna = URIRef("http://example.org/donna") # Add triples using store's add() method. g.add((donna, RDF.type, FOAF.Person)) g.add((donna, FOAF.nick, Literal("donna", lang="en"))) g.add((donna, FOAF.name, Literal("Donna Fales"))) g.add((donna, FOAF.mbox, URIRef("mailto:donna@example.org"))) # Add another person ed = URIRef("http://example.org/edward") # Add triples using store's add() method. g.add((ed, RDF.type, FOAF.Person)) g.add((ed, FOAF.nick, Literal("ed", datatype=XSD.string))) g.add((ed, FOAF.name, Literal("Edward Scissorhands"))) g.add((ed, FOAF.mbox, Literal("e.scissorhands@example.org", datatype=XSD.anyURI))) # Iterate over triples in store and print them out. print("--- printing raw triples ---") for s, p, o in g: print((s, p, o)) # For each foaf:Person in the store, print out their mbox property's value. print("--- printing mboxes ---") for person in g.subjects(RDF.type, FOAF.Person): for mbox in g.objects(person, FOAF.mbox): print(mbox) # Bind the FOAF namespace to a prefix for more readable output g.bind("foaf", FOAF) # print all the data in the Notation3 format print("--- printing mboxes ---") print(g.serialize(format='n3')) A SPARQL query example ====================== .. code-block:: python from rdflib import Graph # Create a Graph, parse in Internet data g = Graph().parse("http://www.w3.org/People/Berners-Lee/card") # Query the data in g using SPARQL # This query returns the 'name' of all ``foaf:Person`` instances q = """ PREFIX foaf: SELECT ?name WHERE { ?p rdf:type foaf:Person . ?p foaf:name ?name . } """ # Apply the query to the graph and iterate through results for r in g.query(q): print(r["name"]) # prints: Timothy Berners-Lee More examples ============= There are many more :doc:`examples ` in the :file:`examples` folder in the source distribution.