Exemplo n.º 1
0
    def test_queries_context(self):
        """ Test resource.all() and get_by() with specified context. """

        store, session = self._get_store_session()
        self._create_persons(session)
        Person = session.get_class(surf.ns.FOAF + "Person")
        context = URIRef("http://my_context_1")
        store.clear(context)

        jane = session.get_resource("http://jane", Person, context = context)
        jane.foaf_name = "Jane"
        jane.save()

        persons = list(Person.all().context(context))
        self.assertEquals(len(persons), 1)

        persons = Person.get_by(foaf_name = Literal("Jane")).context(context)
        self.assertEquals(len(list(persons)), 1)

        persons = Person.get_by_attribute(["foaf_name"], context = context)
        self.assertEquals(len(persons), 1)
Exemplo n.º 2
0
def test_from_named():
    """
    Try to produce query that contains FROM & FROM NAMED clauses.
    """

    expected = canonical(u"""
        SELECT ?s ?p ?o
        FROM <http://uri1>
        FROM NAMED <http://uri1>
        FROM NAMED <http://uri2>
        WHERE {
            ?s ?p ?o
        }
    """)

    query = select("?s", "?p", "?o").where(("?s", "?p", "?o"))
    query.from_("http://uri1")
    query.from_named("http://uri1", URIRef("http://uri2"))
    result = canonical(SparqlTranslator(query).translate())

    assert expected == result
Exemplo n.º 3
0
    def test_full(self):
        """ Test loading details. """

        _, session = self._get_store_session()
        self._create_persons(session)
        Person = session.get_class(surf.ns.FOAF + "Person")

        # Create inverse foaf_knows attribute for Mary
        jane = session.get_resource("http://Jane", Person)
        jane.foaf_knows = URIRef("http://Mary")
        jane.save()

        persons = Person.all().get_by(foaf_name = Literal("Mary")).full()
        persons = list(persons)
        self.assertTrue(len(persons[0].rdf_direct) > 1)
        self.assertTrue(len(persons[0].rdf_inverse) > 0)

        # Now, only direct
        persons = Person.all().get_by(foaf_name = Literal("Mary")).full(only_direct = True)
        persons = list(persons)
        self.assertTrue(len(persons[0].rdf_direct) > 1)
        self.assertTrue(len(persons[0].rdf_inverse) == 0)
Exemplo n.º 4
0
    def test_init_namespace(self):
        """ Test resource initialization in specified namespace. """
        
        _, session = self._get_store_session()

        Person = session.get_class(surf.ns.FOAF.Person)
        surf.ns.register(nstest = "http://example.com/ns#")

        # namespace is an instance of Namespace
        p = Person(namespace = surf.ns.NSTEST)
        ns, _ = uri_split(p.subject)
        self.assertEqual(ns, "NSTEST")
        
        # namespace is an instance of URIRef
        p = Person(namespace = URIRef("http://example.com/ns#"))
        ns, _ = uri_split(p.subject)
        self.assertEqual(ns, "NSTEST")

        # namespace is string
        p = Person(namespace = "http://example.com/ns#")
        ns, _ = uri_split(p.subject)
        self.assertEqual(ns, "NSTEST")
Exemplo n.º 5
0
    def __init__(self, reader=None, writer=None, *args, **kwargs):
        self.log = logging.getLogger(self.__class__.__name__)
        self.log.info('initializing the store')
        load_plugins()

        self.__default_context = None
        if "default_context" in kwargs:
            self.__default_context = URIRef(kwargs["default_context"])

        if reader:
            if reader in __readers__:
                self.reader = __readers__[reader](*args, **kwargs)
            elif isinstance(reader, RDFReader):
                # We've received already configured reader, use it.
                self.reader = reader
            else:
                raise PluginNotFoundException(
                    'The <%s> READER plugin was not found' % (reader))
        else:
            self.reader = RDFReader(*args, **kwargs)

        if writer:
            if writer in __writers__:
                self.writer = __writers__[writer](self.reader, *args, **kwargs)
            elif isinstance(writer, RDFWriter):
                # We've received already configured writer, use it.
                self.writer = writer
            else:
                raise PluginNotFoundException(
                    'The <%s> WRITER plugin was not found' % (reader))
        else:
            self.writer = RDFWriter(self.reader, *args, **kwargs)

        if hasattr(self.reader, 'use_subqueries'):
            self.use_subqueries = property(
                fget=lambda self: self.reader.use_subqueries)

        self.log.info('store initialized')
Exemplo n.º 6
0
    def test_keep_context(self):
        """ Test that context does not change during load/save. """
        store, session = self._get_store_session(use_default_context=False)
        Person = session.get_class(surf.ns.FOAF + "Person")

        context = URIRef("http://my_context_1")
        store.clear(context)

        jake = session.get_resource("http://Jake", Person, context=context)
        jake.foaf_name = "Jake"
        jake.save()

        # Get all persons, don't use context
        jake = Person.all().context(NO_CONTEXT).one()
        jake.load()
        jake.foaf_name = "Jacob"
        jake.save()

        # Check that we only changed the foaf_name attribute
        self.assertEquals(len(Person.all().context(context)), 1)
        self.assertEquals(Person.all().context(context).one().foaf_name.first,
                          'Jacob')
        self.assertEquals(len(Person.all().context(NO_CONTEXT)), 1)
Exemplo n.º 7
0
    def __init__(self, reader = None, writer = None, *args, **kwargs):
        super(Store, self).__init__()

        info('initializing the store')

        self.__default_context = None
        if "default_context" in kwargs:
            self.__default_context = URIRef(kwargs["default_context"])

        if reader:
            self.reader = reader if isinstance(reader, RDFReader) else get_reader(reader, *args, **kwargs)
        else:
            self.reader = NoneReader(*args, **kwargs)

        if writer:
            self.writer = writer if isinstance(writer, RDFWriter) else get_writer(writer, self.reader, *args, **kwargs)
        else:
            self.writer = NoneWriter(self.reader, *args, **kwargs)

        if hasattr(self.reader, 'use_subqueries'):
            self.use_subqueries = property(fget=lambda self: self.reader.use_subqueries)

        info('store initialized')
Exemplo n.º 8
0
    def test_clear_context(self):
        """ Test clear() with context. """

        store, session = self._get_store_session(use_default_context=False)
        Person = session.get_class(surf.ns.FOAF + "Person")

        context = URIRef("http://my_context_1")
        store.clear(context)

        # First clear given context
        jake = session.get_resource("http://Jake", Person, context = context)
        jake.foaf_name = "Jake"
        jake.save()

        jacob = session.get_resource("http://Jacob", Person)
        jacob.foaf_name = "Jacob"
        jacob.save()

        store.clear(context)

        persons = list(Person.all().context(context))
        self.assertEquals(len(persons), 0)
        persons = list(Person.all().context(NO_CONTEXT))
        self.assertEquals(len(persons), 1)

        # Now clear default context
        jake = session.get_resource("http://Jake", Person, context = context)
        jake.foaf_name = "Jake"
        jake.save()

        store.clear()

        persons = list(Person.all().context(context))
        self.assertEquals(len(persons), 1)
        # Only Jake is left
        persons = list(Person.all().context(NO_CONTEXT))
        self.assertEquals(len(persons), 1)
Exemplo n.º 9
0
    def map_instance(self,
                     concept,
                     subject,
                     store=None,
                     classes=[],
                     block_auto_load=False,
                     context=None,
                     query_contexts=None):
        """Create a `instance` of the `class` specified by `uri` and `classes`
        to be inherited, see `map_type` for more information. """

        if not type(subject) in [URIRef, BNode]:
            subject = URIRef(unicode(subject))

        if not store:
            store = self.default_store_key

        if not (isinstance(concept, type) and issubclass(concept, Resource)):
            concept = self.map_type(concept, store, *classes)

        return concept(subject,
                       block_auto_load=block_auto_load,
                       context=context,
                       query_contexts=query_contexts)
Exemplo n.º 10
0
    def map_instance(self,
                     concept,
                     subject,
                     store=None,
                     classes=None,
                     block_auto_load=False,
                     context=None):
        """Create an `instance` of the `class` specified by `uri` and `classes`
        to be inherited, see `map_type` for more information. """

        classes = classes if isinstance(classes, (tuple, set, list)) else []

        if not isinstance(subject, (URIRef, BNode)):
            subject = URIRef(str(subject))

        if not store:
            store = self.default_store_key

        if not (isinstance(concept, type) and issubclass(concept, Resource)):
            concept = self.map_type(concept, store=store, classes=classes)

        return concept(subject,
                       block_auto_load=block_auto_load,
                       context=context)
Exemplo n.º 11
0
 def remove(self, s):
   s = URIRef(s) if  not isinstance(s, URIRef) else s
   self.store.remove_triple(s, None, None)
   self.store.remove_triple(None, None, s)
Exemplo n.º 12
0
def rdfapi(request, action="read"):
  # get base subject
  s = request.REQUEST['s']
  if not surf.util.is_uri(s):
    s = surf.ns.LOCAL[s]

  crdf = CignoRDF()
  _subject = crdf.CignoResources(s)

  #s = 'http://cigno.ve.ismar.cnr.it/data/geonode:parchi_nazionali_regionali'
  #p = "http://purl.org/dc/terms/hasPart"
  #o = 'http://cigno.ve.ismar.cnr.it/data/'
  #pl = 'has part'
  #ol = 'esempio'

  if action != 'read' and not request.user.is_authenticated():
    json = {
      "success": False,
      "errors": "You are not allowed to change relations for this resource."
      }
    json_str = simplejson.dumps ( json, sort_keys=True, indent=4 )
    mimetype = "application/json"
    mimetype = "text/plain" # debug to see it indented in browser                                                                                                                          
    return HttpResponse("User not authorized to delete map", mimetype=mimetype, status=403)
    return response


  if action == 'read':
    # TODO inspect resource type
    json = {'rows': [], 'count': 0}

    # append converage
    # uritype = 'http://purl.org/dc/terms/spatial'
    #     for node in getattr(_subject, surf.util.rdf2attr(uritype, True)):
    #       _predicate = crdf.Properties(uritype)
    #       node = crdf.GeoNames(node) if  isinstance(node, URIRef) else node
    #       node.load()
    #       _object = node
    #       json['rows'].append({'id': '%s|%s|%s' % (s, _predicate.subject, _object.subject),
    #                            's': s, 
    #                            'p': _predicate.subject, 
    #                            'o': _object.subject,
    #                            'pl': lbyl(_predicate.rdfs_label),
    #                            'ol': lbyl(_object.gn_name),
    #                            'd': True
    #               })

    for uritype in supported_relations:
      for node in getattr(_subject, surf.util.rdf2attr(uritype, True)):
        _predicate = crdf.Properties(uritype)
        node = crdf.CignoResources(node) if  isinstance(node, URIRef) else node
        node.load()
        _object = node
        json['rows'].append({'id': '%s|%s|%s' % (s, _predicate.subject, _object.subject),
                             's': s, 
                             'p': _predicate.subject, 
                             'o': _object.subject,
                             'pl': lbyl(_predicate.rdfs_label),
                             'ol': lbyl(_object.rdfs_label),
                             'd': True
                             })

    for uritype in supported_relations:
      if URIRef(uritype) in _subject.rdf_inverse:
        _predicate = crdf.Properties(reverse_relations[uritype])
        for node in _subject.rdf_inverse[URIRef(uritype)]:
          node = crdf.CignoResources(node) if  isinstance(node, URIRef) else node
          node.load()
          _object = node
          json['rows'].append({'id': '%s|%s|%s' % (s, _predicate.subject, _object.subject),
                             's': s, 
                             'p': _predicate.subject, 
                             'o': _object.subject,
                             'pl': lbyl(_predicate.rdfs_label),
                             'ol': lbyl(_object.rdfs_label),
                             'd': False
                             })
    
  elif action == 'create':
    rows = simplejson.loads(request.REQUEST['rows'])
    if not isinstance(rows, list): rows = [rows]
    for row in rows:
      crdf.store.add_triple(rdflib.URIRef(s), rdflib.URIRef(row['p']), rdflib.URIRef(row['o']))
      # if row['p'] in reverse_relations:
      #  store.add_triple(rdflib.URIRef(row['o']), rdflib.URIRef(reverse_relations[row['p']]), rdflib.URIRef(s))
    crdf.store.save()
    # if external try to load rdf info
    # TODO: use a better test and test if already loaded
    if not row['o'].startswith(surf.ns.LOCAL):
      crdf.store.load_triples(source = row['o'])

    json = {'success': True}
    # get type
    #result = session.default_store.execute_sparql("SELECT ?o WHERE { <%s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o }" % )
    #if len(result['results']['bindings']) >0:
    #  type_uri = result['results']['bindings'][0]['o']['value']

  elif action == 'destroy':
    rows = simplejson.loads(request.REQUEST['rows'])
    if not isinstance(rows, list): rows = [rows]
    for row in rows:
      # get triple by id 
      s, p, o = row['id'].split('|')      
      crdf.store.remove_triple(rdflib.URIRef(s), rdflib.URIRef(p), rdflib.URIRef(o))
      # if p in reverse_relations:
      #  store.remove_triple(rdflib.URIRef(o), rdflib.URIRef(reverse_relations[p]), rdflib.URIRef(s))
      
    crdf.store.save()
    json = {'success': True}
    # get type
    #result = session.default_store.execute_sparql("SELECT ?o WHERE { <%s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o }" % )
    #if len(result['results']['bindings']) >0:
    #  type_uri = result['results']['bindings'][0]['o']['value']

  json_str = simplejson.dumps ( json, sort_keys=True, indent=4 )
  mimetype = "application/json"
  mimetype = "text/plain" # debug to see it indented in browser                                                                                                                          
  response = HttpResponse( json_str, mimetype=mimetype )
  return response
Exemplo n.º 13
0
def graph_connections(request):
    crdf = CignoRDF()
    #s = 'http://cigno.ve.ismar.cnr.it/data/geonode:parchi_nazionali_regionali'
    s = request.REQUEST['s']
    if not surf.util.is_uri(s):
      s = surf.ns.LOCAL[s]

    res = crdf.CignoResources(s)

    nodes = {"%s" % res.subject: {'id': "%s" % res.subject,
                                  'name': "%s" % res.rdfs_label.first,
                                  'data': { 'url': "%s" % res.subject,
                                            'uuid': "%s" % res.cigno_uuid.first
                                            },
                                  "adjacencies":[],
                                  'root': True
                                  }
             }
    
    for uritype in supported_relations:
      for node in getattr(res, surf.util.rdf2attr(uritype, True)):
        node = crdf.CignoResources(node) if  isinstance(node, URIRef) else node
        nodes["%s" % node] = {'id': "%s" % node.subject,
                              'name': "%s" % node.rdfs_label.first,
                              'data': { 'url': "%s" % node.subject,
                                        'uuid': "%s" % node.cigno_uuid.first
                                        },
                              "adjacencies":[]
                              }
        
        nodes["%s" % node]["adjacencies"].append({"nodeTo": "%s" % s,
                                                  "data": {}
                                                  }
                                                 )
        nodes["%s" % s]["adjacencies"].append({"nodeTo": "%s" % node.subject,
                                        "data": {}
                                        }
                                       )

      _subject = res
      if URIRef(uritype) in _subject.rdf_inverse:
        _predicate = crdf.Properties(reverse_relations[uritype])
        for node in _subject.rdf_inverse[URIRef(uritype)]:
          node = crdf.CignoResources(node) if  isinstance(node, URIRef) else node
          node.load()
          _object = node

          nodes["%s" % node] = {'id': "%s" % node.subject,
                                'name': "%s" % node.rdfs_label.first,
                                'data': { 'url': "%s" % node.subject,
                                          'uuid': "%s" % node.cigno_uuid.first
                                          },
                                "adjacencies":[]
                                }
        
          nodes["%s" % node]["adjacencies"].append({"nodeTo": "%s" % s,
                                                    "data": {}
                                                    }
                                                   )
          nodes["%s" % s]["adjacencies"].append({"nodeTo": "%s" % node.subject,
                                                 "data": {}
                                                 }
                                                )



            
    return HttpResponse(simplejson.dumps([v for k, v in nodes.iteritems()], indent = 4))
Exemplo n.º 14
0
 def add_triple(self, s, p, o):
   s = URIRef(s) if  not isinstance(s, URIRef) else s
   p = URIRef(p) if  not isinstance(p, URIRef) else p
   o = URIRef(o) if  not isinstance(o, URIRef) else o
   self.store.add_triple(s, p, o)
   self.store.save()
Exemplo n.º 15
0
    def __set_context(self, value):
        if not isinstance(value, URIRef):
            value = URIRef(value)

        self.__context = value
Exemplo n.º 16
0
    def _get_by_subquery(self, params):
        context = params.get("context", None)

        inner_query = select("?s")
        inner_params = params.copy()
        if "order" in params:
            # "order" needs to stay in subquery,
            # but doesn't do anything useful in main query
            del params["order"]
        _apply_solution_modifiers(inner_params, inner_query)

        if params.get('direct_only'):
            query = select("?s", "?p", "?v", "?c").distinct()
            query.group(('?s', '?p', '?v'), optional_group(('?v', a, '?c')))
        else:
            direct_query = select("?s", "?p", "?v", "?c", '("0" AS ?i)')
            direct_query.distinct()
            direct_query.group(('?s', '?p', '?v'),
                               optional_group(('?v', a, '?c')))

            indirect_query = select("?s", "?p", "?v", "?c", '("1" AS ?i)')
            indirect_query.distinct()
            indirect_query.group(('?v', '?p', '?s'),
                                 optional_group(('?v', a, '?c')))

            query = select("?s", "?p", "?v", "?c", "?i")
            query.union(direct_query, indirect_query)

        query.where(inner_query)
        if not (context is None):
            query.from_(context)

        # Need ordering in outer query
        if "order" in params:
            if params["order"]:
                # Order by subject URI
                query.order_by("?s")
            else:
                # Match another variable, order by it
                query.optional_group(("?s", params["order"], "?order"))
                query.order_by("?order")

        table = self._to_table(self._execute(query))
        subjects = {}
        results = []
        for match in table:
            # Make sure subject and predicate are URIs (they have to be!),
            # this works around bug in Virtuoso -- it sometimes returns
            # URIs as Literals.
            subject = URIRef(match["s"])
            predicate = URIRef(match["p"])
            value = match["v"]
            # Inverse given if direct_only is False
            inverse = match.get("i") == "1"

            # Add subject to result list if it's not there
            if subject not in subjects:
                instance_data = {"direct": {}, "inverse": {}}
                subjects[subject] = instance_data
                results.append((subject, instance_data))

            if inverse:
                attributes = subjects[subject]["inverse"]
            else:
                attributes = subjects[subject]["direct"]
            # Add predicate to subject's predicates if it's not there
            if predicate not in attributes:
                attributes[predicate] = {}

            # Add value to subject->predicate if ...
            predicate_values = attributes[predicate]
            if value not in predicate_values:
                predicate_values[value] = []

            # Add RDF type of the value to subject->predicate->value list
            if "c" in match:
                predicate_values[value].append(match["c"])

        return results
Exemplo n.º 17
0
    def __get_by_subquery(self, params):
        contexts = params.get("contexts", None)

        inner_query = select("?s")
        inner_params = params.copy()
        if "order" in params:
            # "order" needs to stay in subquery,
            # but doesn't do anything useful in main query
            del params["order"]
        self.__apply_limit_offset_order_get_by_filter(inner_params, inner_query)


        query = select("?s", "?p", "?v", "?c", "?g").distinct()
        # Get values with object type & context
        # TODO we need to query both contexts, from ?s -> rdf_type & ?v -> rdf_type but Virtuoso does not bind ?g twice. Bug or feature?
        query.group(('?s', '?p', '?v'),
                    optional_group(('?v', a, '?c')),
                    optional_group(named_group("?g", ("?s", a, "?v"))))
                    #optional_group(named_group("?g", ("?v", a, "?c"))))
        query.where(inner_query)
        if contexts:
            query.from_(*contexts)
            query.from_named(*contexts)

        # Need ordering in outer query
        if "order" in params:
            if params["order"] == True:
                # Order by subject URI
                query.order_by("?s")
            else:
                # Match another variable, order by it
                query.optional_group(("?s", params["order"], "?order"))
                query.order_by("?order")

        table = self._to_table(self._execute(query))
        subjects = {}
        results = []
        for match in table:
            # Make sure subject and predicate are URIs (they have to be!),
            # this works around bug in Virtuoso -- it sometimes returns
            # URIs as Literals.
            subject = URIRef(match["s"])
            predicate = URIRef(match["p"])
            value = match["v"]

            # Add subject to result list if it's not there
            if not subject in subjects:
                instance_data = {"direct" : {}}
                subjects[subject] = instance_data
                results.append((subject, instance_data))

            # Add predicate to subject's direct predicates if it's not there
            direct_attributes = subjects[subject]["direct"]
            if not predicate in direct_attributes:
                direct_attributes[predicate] = {}

            # "context" comes from an optional group and is missing if the
            # triple is stored in the unamed graph
            context = match.get("g")

            # Add value to subject->predicate if ...
            predicate_values = direct_attributes[predicate]
            if not value in predicate_values:
                predicate_values[value] = {context: []}

            # Add RDF type of the value to subject->predicate->value list
            if "c" in match:
                predicate_values[value][context].append(match["c"])

        return results