|
1
|
|
|
"""Contains the class representing a triple node.""" |
|
2
|
|
|
|
|
3
|
1 |
|
from .abstractnode import register, AbstractNode |
|
4
|
1 |
|
from .list import List |
|
5
|
|
|
|
|
6
|
1 |
|
@register |
|
7
|
1 |
|
class Triple(AbstractNode): |
|
8
|
|
|
"""Represents a triple. |
|
9
|
|
|
https://github.com/ProjetPP/Documentation/blob/master/data-model.md#triple |
|
10
|
|
|
""" |
|
11
|
1 |
|
__slots__ = () |
|
12
|
1 |
|
_type = 'triple' |
|
13
|
1 |
|
_possible_attributes = ('subject', 'predicate', 'object', 'inverse_predicate') |
|
14
|
|
|
|
|
15
|
1 |
|
def _check_attributes(self, attributes): |
|
16
|
1 |
|
attributes['inverse_predicate'] = \ |
|
17
|
|
|
attributes.get('inverse_predicate', List([])) |
|
18
|
1 |
|
super(Triple, self)._check_attributes(attributes) |
|
19
|
1 |
|
if not all(isinstance(x, AbstractNode) for x in attributes.values()): |
|
20
|
1 |
|
raise TypeError('One of Triple\'s constructor argument ' |
|
21
|
|
|
'is not an AbstractNode instance.') |
|
22
|
|
|
|
|
23
|
1 |
|
def as_dict(self): |
|
24
|
|
|
"""Do not put inverse-predicate in the output dict if it |
|
25
|
|
|
is an empty list.""" |
|
26
|
1 |
|
d = super(Triple, self).as_dict() |
|
27
|
1 |
|
if d['inverse-predicate']['type'] == 'list' and \ |
|
28
|
|
|
d['inverse-predicate']['list'] == []: |
|
29
|
1 |
|
del d['inverse-predicate'] |
|
30
|
1 |
|
return d |
|
31
|
|
|
|
|
32
|
1 |
|
@property |
|
33
|
|
|
def predicate_set(self): |
|
34
|
|
|
"""Return a frozenset of predicates, extracting it from the list |
|
35
|
|
|
if it is a List node.""" |
|
36
|
1 |
|
if isinstance(self.predicate, List): |
|
37
|
1 |
|
return frozenset(self.predicate.list) |
|
38
|
|
|
else: |
|
39
|
1 |
|
return frozenset({self.predicate}) |
|
40
|
|
|
|
|
41
|
1 |
|
@property |
|
42
|
|
|
def inverse_predicate_set(self): |
|
43
|
|
|
"""Return a frozenset of inverse predicates, extracting it from the list |
|
44
|
|
|
if it is a List node.""" |
|
45
|
|
|
if isinstance(self.inverse_predicate, List): |
|
46
|
|
|
return frozenset(self.inverse_predicate.list) |
|
47
|
|
|
else: |
|
48
|
|
|
return frozenset({self.inverse_predicate}) |
|
49
|
|
|
|
|
50
|
1 |
|
def inverse(self): |
|
51
|
1 |
|
return self.__class__(self.object, self.inverse_predicate, |
|
52
|
|
|
self.subject, self.predicate) |
|
53
|
|
|
|