diff env/lib/python3.7/site-packages/rdflib/resource.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/rdflib/resource.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,483 +0,0 @@
-# -*- coding: utf-8 -*-
-from rdflib import py3compat
-
-__doc__ = py3compat.format_doctest_out("""
-The :class:`~rdflib.resource.Resource` class wraps a
-:class:`~rdflib.graph.Graph`
-and a resource reference (i.e. a :class:`rdflib.term.URIRef` or
-:class:`rdflib.term.BNode`) to support a resource-oriented way of
-working with a graph.
-
-It contains methods directly corresponding to those methods of the Graph
-interface that relate to reading and writing data. The difference is that a
-Resource also binds a resource identifier, making it possible to work without
-tracking both the graph and a current subject. This makes for a "resource
-oriented" style, as compared to the triple orientation of the Graph API.
-
-Resulting generators are also wrapped so that any resource reference values
-(:class:`rdflib.term.URIRef`s and :class:`rdflib.term.BNode`s) are in turn
-wrapped as Resources. (Note that this behaviour differs from the corresponding
-methods in :class:`~rdflib.graph.Graph`, where no such conversion takes place.)
-
-
-Basic Usage Scenario
---------------------
-
-Start by importing things we need and define some namespaces::
-
-    >>> from rdflib import *
-    >>> FOAF = Namespace("http://xmlns.com/foaf/0.1/")
-    >>> CV = Namespace("http://purl.org/captsolo/resume-rdf/0.2/cv#")
-
-Load some RDF data::
-
-    >>> graph = Graph().parse(format='n3', data='''
-    ... @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
-    ... @prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
-    ... @prefix foaf: <http://xmlns.com/foaf/0.1/> .
-    ... @prefix cv: <http://purl.org/captsolo/resume-rdf/0.2/cv#> .
-    ...
-    ... @base <http://example.org/> .
-    ...
-    ... </person/some1#self> a foaf:Person;
-    ...     rdfs:comment "Just a Python & RDF hacker."@en;
-    ...     foaf:depiction </images/person/some1.jpg>;
-    ...     foaf:homepage <http://example.net/>;
-    ...     foaf:name "Some Body" .
-    ...
-    ... </images/person/some1.jpg> a foaf:Image;
-    ...     rdfs:label "some 1"@en;
-    ...     rdfs:comment "Just an image"@en;
-    ...     foaf:thumbnail </images/person/some1-thumb.jpg> .
-    ...
-    ... </images/person/some1-thumb.jpg> a foaf:Image .
-    ...
-    ... [] a cv:CV;
-    ...     cv:aboutPerson </person/some1#self>;
-    ...     cv:hasWorkHistory [ cv:employedIn </#company>;
-    ...             cv:startDate "2009-09-04"^^xsd:date ] .
-    ... ''')
-
-Create a Resource::
-
-    >>> person = Resource(
-    ...     graph, URIRef("http://example.org/person/some1#self"))
-
-Retrieve some basic facts::
-
-    >>> person.identifier
-    rdflib.term.URIRef(%(u)s'http://example.org/person/some1#self')
-
-    >>> person.value(FOAF.name)
-    rdflib.term.Literal(%(u)s'Some Body')
-
-    >>> person.value(RDFS.comment)
-    rdflib.term.Literal(%(u)s'Just a Python & RDF hacker.', lang=%(u)s'en')
-
-Resources can be sliced (like graphs, but the subject is fixed)::
-
-    >>> for name in person[FOAF.name]:
-    ...     print(name)
-    Some Body
-    >>> person[FOAF.name : Literal("Some Body")]
-    True
-
-Resources as unicode are represented by their identifiers as unicode::
-
-    >>> %(unicode)s(person)  #doctest: +SKIP
-    %(u)s'Resource(http://example.org/person/some1#self'
-
-Resource references are also Resources, so you can easily get e.g. a qname
-for the type of a resource, like::
-
-    >>> person.value(RDF.type).qname()
-    %(u)s'foaf:Person'
-
-Or for the predicates of a resource::
-
-    >>> sorted(
-    ...     p.qname() for p in person.predicates()
-    ... )  #doctest: +NORMALIZE_WHITESPACE +SKIP
-    [%(u)s'foaf:depiction', %(u)s'foaf:homepage',
-     %(u)s'foaf:name', %(u)s'rdf:type', %(u)s'rdfs:comment']
-
-Follow relations and get more data from their Resources as well::
-
-    >>> for pic in person.objects(FOAF.depiction):
-    ...     print(pic.identifier)
-    ...     print(pic.value(RDF.type).qname())
-    ...     print(pic.label())
-    ...     print(pic.comment())
-    ...     print(pic.value(FOAF.thumbnail).identifier)
-    http://example.org/images/person/some1.jpg
-    foaf:Image
-    some 1
-    Just an image
-    http://example.org/images/person/some1-thumb.jpg
-
-    >>> for cv in person.subjects(CV.aboutPerson):
-    ...     work = list(cv.objects(CV.hasWorkHistory))[0]
-    ...     print(work.value(CV.employedIn).identifier)
-    ...     print(work.value(CV.startDate))
-    http://example.org/#company
-    2009-09-04
-
-It's just as easy to work with the predicates of a resource::
-
-    >>> for s, p in person.subject_predicates():
-    ...     print(s.value(RDF.type).qname())
-    ...     print(p.qname())
-    ...     for s, o in p.subject_objects():
-    ...         print(s.value(RDF.type).qname())
-    ...         print(o.value(RDF.type).qname())
-    cv:CV
-    cv:aboutPerson
-    cv:CV
-    foaf:Person
-
-This is useful for e.g. inspection::
-
-    >>> thumb_ref = URIRef("http://example.org/images/person/some1-thumb.jpg")
-    >>> thumb = Resource(graph, thumb_ref)
-    >>> for p, o in thumb.predicate_objects():
-    ...     print(p.qname())
-    ...     print(o.qname())
-    rdf:type
-    foaf:Image
-
-Similarly, adding, setting and removing data is easy::
-
-    >>> thumb.add(RDFS.label, Literal("thumb"))
-    >>> print(thumb.label())
-    thumb
-    >>> thumb.set(RDFS.label, Literal("thumbnail"))
-    >>> print(thumb.label())
-    thumbnail
-    >>> thumb.remove(RDFS.label)
-    >>> list(thumb.objects(RDFS.label))
-    []
-
-
-Schema Example
---------------
-
-With this artificial schema data::
-
-    >>> graph = Graph().parse(format='n3', data='''
-    ... @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 v: <http://example.org/def/v#> .
-    ...
-    ... v:Artifact a owl:Class .
-    ...
-    ... v:Document a owl:Class;
-    ...     rdfs:subClassOf v:Artifact .
-    ...
-    ... v:Paper a owl:Class;
-    ...     rdfs:subClassOf v:Document .
-    ...
-    ... v:Choice owl:oneOf (v:One v:Other) .
-    ...
-    ... v:Stuff a rdf:Seq; rdf:_1 v:One; rdf:_2 v:Other .
-    ...
-    ... ''')
-
-From this class::
-
-    >>> artifact = Resource(graph, URIRef("http://example.org/def/v#Artifact"))
-
-we can get at subclasses::
-
-    >>> subclasses = list(artifact.transitive_subjects(RDFS.subClassOf))
-    >>> [c.qname() for c in subclasses]
-    [%(u)s'v:Artifact', %(u)s'v:Document', %(u)s'v:Paper']
-
-and superclasses from the last subclass::
-
-    >>> [c.qname() for c in subclasses[-1].transitive_objects(RDFS.subClassOf)]
-    [%(u)s'v:Paper', %(u)s'v:Document', %(u)s'v:Artifact']
-
-Get items from the Choice::
-
-    >>> choice = Resource(graph, URIRef("http://example.org/def/v#Choice"))
-    >>> [it.qname() for it in choice.value(OWL.oneOf).items()]
-    [%(u)s'v:One', %(u)s'v:Other']
-
-And the sequence of Stuff::
-
-    >>> stuff = Resource(graph, URIRef("http://example.org/def/v#Stuff"))
-    >>> [it.qname() for it in stuff.seq()]
-    [%(u)s'v:One', %(u)s'v:Other']
-
-On add, other resources are auto-unboxed:
-    >>> paper = Resource(graph, URIRef("http://example.org/def/v#Paper"))
-    >>> paper.add(RDFS.subClassOf, artifact)
-    >>> artifact in paper.objects(RDFS.subClassOf) # checks Resource instance
-    True
-    >>> (paper._identifier, RDFS.subClassOf, artifact._identifier) in graph
-    True
-
-
-Technical Details
------------------
-
-Comparison is based on graph and identifier::
-
-    >>> g1 = Graph()
-    >>> t1 = Resource(g1, URIRef("http://example.org/thing"))
-    >>> t2 = Resource(g1, URIRef("http://example.org/thing"))
-    >>> t3 = Resource(g1, URIRef("http://example.org/other"))
-    >>> t4 = Resource(Graph(), URIRef("http://example.org/other"))
-
-    >>> t1 is t2
-    False
-
-    >>> t1 == t2
-    True
-    >>> t1 != t2
-    False
-
-    >>> t1 == t3
-    False
-    >>> t1 != t3
-    True
-
-    >>> t3 != t4
-    True
-
-    >>> t3 < t1 and t1 > t3
-    True
-    >>> t1 >= t1 and t1 >= t3
-    True
-    >>> t1 <= t1 and t3 <= t1
-    True
-
-    >>> t1 < t1 or t1 < t3 or t3 > t1 or t3 > t3
-    False
-
-Hash is computed from graph and identifier::
-
-    >>> g1 = Graph()
-    >>> t1 = Resource(g1, URIRef("http://example.org/thing"))
-
-    >>> hash(t1) == hash(Resource(g1, URIRef("http://example.org/thing")))
-    True
-
-    >>> hash(t1) == hash(Resource(Graph(), t1.identifier))
-    False
-    >>> hash(t1) == hash(Resource(Graph(), URIRef("http://example.org/thing")))
-    False
-
-The Resource class is suitable as a base class for mapper toolkits. For
-example, consider this utility for accessing RDF properties via qname-like
-attributes::
-
-    >>> class Item(Resource):
-    ...
-    ...     def __getattr__(self, p):
-    ...         return list(self.objects(self._to_ref(*p.split('_', 1))))
-    ...
-    ...     def _to_ref(self, pfx, name):
-    ...         return URIRef(self._graph.store.namespace(pfx) + name)
-
-It works as follows::
-
-    >>> graph = Graph().parse(format='n3', data='''
-    ... @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
-    ... @prefix foaf: <http://xmlns.com/foaf/0.1/> .
-    ...
-    ... @base <http://example.org/> .
-    ... </person/some1#self>
-    ...     foaf:name "Some Body";
-    ...     foaf:depiction </images/person/some1.jpg> .
-    ... </images/person/some1.jpg> rdfs:comment "Just an image"@en .
-    ... ''')
-
-    >>> person = Item(graph, URIRef("http://example.org/person/some1#self"))
-
-    >>> print(person.foaf_name[0])
-    Some Body
-
-The mechanism for wrapping references as resources cooperates with subclasses.
-Therefore, accessing referenced resources automatically creates new ``Item``
-objects::
-
-    >>> isinstance(person.foaf_depiction[0], Item)
-    True
-
-    >>> print(person.foaf_depiction[0].rdfs_comment[0])
-    Just an image
-
-""")
-
-from rdflib.term import Node, BNode, URIRef
-from rdflib.namespace import RDF
-from rdflib.paths import Path
-
-__all__ = ['Resource']
-
-
-class Resource(object):
-
-    def __init__(self, graph, subject):
-        self._graph = graph
-        self._identifier = subject
-
-    graph = property(lambda self: self._graph)
-
-    identifier = property(lambda self: self._identifier)
-
-    def __hash__(self):
-        return hash(Resource) ^ hash(self._graph) ^ hash(self._identifier)
-
-    def __eq__(self, other):
-        return (isinstance(other, Resource) and
-                self._graph == other._graph and
-                self._identifier == other._identifier)
-
-    __ne__ = lambda self, other: not self == other
-
-    def __lt__(self, other):
-        if isinstance(other, Resource):
-            return self._identifier < other._identifier
-        else:
-            return False
-
-    __gt__ = lambda self, other: not (self < other or self == other)
-    __le__ = lambda self, other: self < other or self == other
-    __ge__ = lambda self, other: not self < other
-
-    def __unicode__(self):
-        return str(self._identifier)
-
-    if py3compat.PY3:
-        __str__ = __unicode__
-
-    def add(self, p, o):
-        if isinstance(o, Resource):
-            o = o._identifier
-
-        self._graph.add((self._identifier, p, o))
-
-    def remove(self, p, o=None):
-        if isinstance(o, Resource):
-            o = o._identifier
-
-        self._graph.remove((self._identifier, p, o))
-
-    def set(self, p, o):
-        if isinstance(o, Resource):
-            o = o._identifier
-
-        self._graph.set((self._identifier, p, o))
-
-    def subjects(self, predicate=None):  # rev
-        return self._resources(
-            self._graph.subjects(predicate, self._identifier))
-
-    def predicates(self, o=None):
-        if isinstance(o, Resource):
-            o = o._identifier
-
-        return self._resources(
-            self._graph.predicates(self._identifier, o))
-
-    def objects(self, predicate=None):
-        return self._resources(
-            self._graph.objects(self._identifier, predicate))
-
-    def subject_predicates(self):
-        return self._resource_pairs(
-            self._graph.subject_predicates(self._identifier))
-
-    def subject_objects(self):
-        return self._resource_pairs(
-            self._graph.subject_objects(self._identifier))
-
-    def predicate_objects(self):
-        return self._resource_pairs(
-            self._graph.predicate_objects(self._identifier))
-
-    def value(self, p=RDF.value, o=None, default=None, any=True):
-        if isinstance(o, Resource):
-            o = o._identifier
-
-        return self._cast(
-            self._graph.value(self._identifier, p, o, default, any))
-
-    def label(self):
-        return self._graph.label(self._identifier)
-
-    def comment(self):
-        return self._graph.comment(self._identifier)
-
-    def items(self):
-        return self._resources(self._graph.items(self._identifier))
-
-    def transitive_objects(self, predicate, remember=None):
-        return self._resources(self._graph.transitive_objects(
-            self._identifier, predicate, remember))
-
-    def transitive_subjects(self, predicate, remember=None):
-        return self._resources(self._graph.transitive_subjects(
-            predicate, self._identifier, remember))
-
-    def seq(self):
-        return self._resources(self._graph.seq(self._identifier))
-
-    def qname(self):
-        return self._graph.qname(self._identifier)
-
-    def _resource_pairs(self, pairs):
-        for s1, s2 in pairs:
-            yield self._cast(s1), self._cast(s2)
-
-    def _resource_triples(self, triples):
-        for s,p,o in triples:
-            yield self._cast(s), self._cast(p), self._cast(o)
-
-    def _resources(self, nodes):
-        for node in nodes:
-            yield self._cast(node)
-
-    def _cast(self, node):
-        if isinstance(node, (BNode, URIRef)):
-            return self._new(node)
-        else:
-            return node
-
-    def __iter__(self):
-        return self._resource_triples(self._graph.triples((self.identifier, None, None)))
-
-    def __getitem__(self, item):
-        if isinstance(item, slice):
-            if item.step:
-                raise TypeError("Resources fix the subject for slicing, and can only be sliced by predicate/object. ")
-            p,o=item.start,item.stop
-            if isinstance(p, Resource): p = p._identifier
-            if isinstance(o, Resource): o = o._identifier
-            if p is None and o is None:
-                return self.predicate_objects()
-            elif p is None:
-                return self.predicates(o)
-            elif o is None:
-                return self.objects(p)
-            else:
-                return (self.identifier, p, o) in self._graph
-        elif isinstance(item, (Node, Path)):
-            return self.objects(item)
-        else:
-            raise TypeError("You can only index a resource by a single rdflib term, a slice of rdflib terms, not %s (%s)"%(item, type(item)))
-
-    def __setitem__(self, item, value):
-        self.set(item, value)
-
-    def _new(self, subject):
-        return type(self)(self._graph, subject)
-
-    def __str__(self):
-        return 'Resource(%s)' % self._identifier
-
-    def __repr__(self):
-        return 'Resource(%s,%s)' % (self._graph, self._identifier)