Source code for franz.openrdf.model.statement

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pylint: disable-msg=C0103 

################################################################################
# Copyright (c) 2006-2017 Franz Inc.  
# All rights reserved. This program and the accompanying materials are
# made available under the terms of the MIT License which accompanies
# this distribution, and is available at http://opensource.org/licenses/MIT
################################################################################

from __future__ import absolute_import
from __future__ import unicode_literals
from builtins import object
from future.utils import python_2_unicode_compatible

from .value import Value, URI, BNode
from .literal import Literal
from ..util import strings


[docs]@python_2_unicode_compatible class Statement(object): """ Lightweight implementation of 'Statement' """
[docs] def __init__(self, subject, predicate, object, context=None): self.subject = subject self.predicate = predicate self.object = object self.context = context self.string_tuple = None
def __eq__(self, other): if not isinstance(other, Statement): return NotImplemented ## The object is potentially the cheapest to check, as types ## of these references might be different. ## In general the number of different predicates in sets of ## statements is the smallest, so predicate equality is checked ## last. spoEqual = self.getObject() == other.getObject() and self.getSubject() == other.getSubject() \ and self.getPredicate() == other.getPredicate() if self.context: return spoEqual and self.getContext() == other.getContext() else: return spoEqual def __hash__(self): return 961 * self.getSubject().__hash__() + 31 * self.getPredicate().__hash__() + self.getObject().__hash__(); def __str__(self): sb= [] sb.append("(") sb.append(self.string_tuple[0]) sb.append(", ") sb.append(self.string_tuple[1]) sb.append(", ") sb.append(self.string_tuple[2]) if len(self.string_tuple) > 3: cxt = self.string_tuple[3] if cxt: sb.append(", ") sb.append(self.string_tuple[3]) elif len(self.string_tuple) > 4: sb.append(", None") if len(self.string_tuple) > 4: sb.append(", ") sb.append(self.string_tuple[4]) sb.append(")") return ''.join(sb) def __len__(self): return len(self.string_tuple) def __getitem__(self, index): if index == 0: return self.getSubject() elif index == 1: return self.getPredicate() elif index == 2: return self.getObject() elif index == 3: return self.getContext() else: raise IndexError("Illegal index %s passed to StatementImpl.\n" + " Legal arguments are integers 0-3")
[docs] def setQuad(self, string_tuple): self.string_tuple = string_tuple
[docs] def getSubject(self): """ Get the subject (the first element of the statement). :return: Subject. :rtype: Value """ if not self.subject: self.subject = Statement.stringTermToTerm(self.string_tuple[0]) return self.subject
[docs] def setSubject(self, subject): self.subject = subject
[docs] def getPredicate(self): """ Get the predicate (the second element of the statement). :return: Predicate. :rtype: URI """ if not self.predicate: self.predicate = Statement.stringTermToTerm(self.string_tuple[1]) return self.predicate
[docs] def setPredicate(self, predicate):self.predicate = predicate
[docs] def getObject(self): """ Get the object (the third element of the statement). :return: Object. :rtype: Value """ if not self.object: self.object = Statement.stringTermToTerm(self.string_tuple[2]) return self.object
[docs] def setObject(self, object): self.object = object
[docs] def getContext(self): """ Get the graph (the fourth, optional element of the statement). :return: Graph URI. :rtype: URI """ if not self.context: if len(self.string_tuple) == 3: return None self.context = Statement.stringTermToTerm(self.string_tuple[3]) return self.context
[docs] def setContext(self, context): self.context = context
[docs] def getTripleID(self): """ Get the statement id. Note that this field might not present, depending on the way in which the statement has been created. :return: A numerical id. :rtype: int """ if len(self.string_tuple) == 5: id = int(self.string_tuple[4]) else: id = -1 return id
[docs] @staticmethod def stringTermToTerm(string_term): """ Given a string representing a term in ntriples format, return a URI, Literal, or BNode. """ if not string_term: return string_term parsed = strings.uriref(string_term) if parsed: return URI(parsed) parsed = strings.literal(string_term) if parsed: return Literal(*parsed) parsed = strings.nodeid(string_term) if parsed: return BNode(parsed) return Literal(string_term)