swap_primer
This is a simple primer using some of the example stuff in the Primer on N3:
http://www.w3.org/2000/10/swap/Primer
Attributes:
mySource
module-attribute
mySource = '\n @prefix : <https://example.com/> .\n @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n @prefix owl: <http://www.w3.org/2002/07/owl#> .\n @prefix dc: <http://purl.org/dc/elements/1.1/> .\n @prefix foo: <http://www.w3.org/2000/10/swap/Primer#>.\n @prefix swap: <http://www.w3.org/2000/10/swap/>.\n\n <> dc:title\n "Primer - Getting into the Semantic Web and RDF using N3".\n\n :pat :knows :jo .\n :pat :age 24 .\n :al :is_child_of :pat .\n\n :pat :child :al, :chaz, :mo ;\n :age 24 ;\n :eyecolor "blue" .\n\n\n :Person a rdfs:Class .\n\n :Pat a :Person .\n\n :Woman a rdfs:Class; rdfs:subClassOf :Person .\n\n :sister a rdf:Property .\n\n :sister rdfs:domain :Person ;\n rdfs:range :Woman .\n\n :Woman = foo:FemaleAdult .\n :Title a rdf:Property; = dc:title .\n '
source: false show_docstring_attributes: false show_docstring_functions: false show_docstring_modules: false show_docstring_classes: false show_signature: false show_signature_annotations: false show_signature_type_parameters: false show_docstring_other_parameters: false show_docstring_parameters: false show_docstring_raises: false show_docstring_receives: false show_docstring_returns: false summary: false show_if_no_docstring: false
from rdflib import ConjunctiveGraph, Literal, Namespace
from rdflib.namespace import DC, OWL
if __name__ == "__main__":
# Firstly, it doesn't have to be so complex.
# Here we create a "Graph" of our work.
# Think of it as a blank piece of graph paper!
primer = ConjunctiveGraph()
myNS = Namespace("https://example.com/") # noqa: N816
primer.add((myNS.pat, myNS.knows, myNS.jo))
# or:
primer.add((myNS["pat"], myNS["age"], Literal(24)))
# Now, with just that, lets see how the system
# recorded *way* too many details about what
# you just asserted as fact.
from pprint import pprint
print("All the things in the Graph:")
pprint(list(primer))
# just think .whatever((s, p, o))
# here we report on what we know
print("==================")
print("Subjects:")
pprint(list(primer.subjects()))
print("Predicates:")
pprint(list(primer.predicates()))
print("Objects:")
pprint(list(primer.objects()))
print("==================")
# and other things that make sense
print("What we know about pat:")
pprint(list(primer.predicate_objects(myNS.pat)))
print("Who is what age?")
pprint(list(primer.subject_objects(myNS.age)))
print("==================")
print("==================")
# Okay, so lets now work with a bigger
# dataset from the example, and start
# with a fresh new graph.
del primer
primer = ConjunctiveGraph()
# Lets start with a verbatim string straight from the primer text:
mySource = """
@prefix : <https://example.com/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix foo: <http://www.w3.org/2000/10/swap/Primer#>.
@prefix swap: <http://www.w3.org/2000/10/swap/>.
<> dc:title
"Primer - Getting into the Semantic Web and RDF using N3".
:pat :knows :jo .
:pat :age 24 .
:al :is_child_of :pat .
:pat :child :al, :chaz, :mo ;
:age 24 ;
:eyecolor "blue" .
:Person a rdfs:Class .
:Pat a :Person .
:Woman a rdfs:Class; rdfs:subClassOf :Person .
:sister a rdf:Property .
:sister rdfs:domain :Person ;
rdfs:range :Woman .
:Woman = foo:FemaleAdult .
:Title a rdf:Property; = dc:title .
""" # --- End of primer code # noqa: N816
# To make this go easier to spit back out...
# technically, we already created a namespace
# with the object init (and it added some namespaces as well)
# By default, your main namespace is the URI of your
# current working directory, so lets make that simpler:
primer.bind("owl", OWL)
primer.bind("dc", DC)
primer.bind("swap", "http://www.w3.org/2000/10/swap/")
# Lets load it up!
primer.parse(data=mySource, format="n3")
# Now you can query, either directly straight into a list:
print()
print("Printing bigger example's triples:")
for i in [(x, y, z) for x, y, z in primer]:
print(i)
# or spit it back out (mostly) the way we created it:
print()
print("Printing bigger example as N3:")
print(primer.serialize(format="n3"))
# for more insight into things already done, lets see the namespaces
print()
print("Printing bigger example's namespaces:")
for n in list(primer.namespaces()):
print(n)
# lets ask something about the data, using a SPARQL query
print()
print("Who are pat's children?")
q = "SELECT ?child WHERE { :pat :child ?child }"
for r in primer.query(q):
print(r)