aboutsummaryrefslogtreecommitdiffstats
path: root/bsfs
diff options
context:
space:
mode:
authorMatthias Baumgartner <dev@igsor.net>2023-02-08 20:15:41 +0100
committerMatthias Baumgartner <dev@igsor.net>2023-02-08 20:15:41 +0100
commitcb819b8c268908b5f6cc680173db86e172847c46 (patch)
tree3046c960ea8377e12655c622f182a2d2115fa712 /bsfs
parentc8fdaaa676afbdcf33344d72bd92b3ccb981cbf8 (diff)
downloadbsfs-cb819b8c268908b5f6cc680173db86e172847c46.tar.gz
bsfs-cb819b8c268908b5f6cc680173db86e172847c46.tar.bz2
bsfs-cb819b8c268908b5f6cc680173db86e172847c46.zip
binary blob in schema and sparql triple store
Diffstat (limited to 'bsfs')
-rw-r--r--bsfs/schema/schema.py1
-rw-r--r--bsfs/schema/types.py5
-rw-r--r--bsfs/triple_store/sparql/sparql.py13
3 files changed, 17 insertions, 2 deletions
diff --git a/bsfs/schema/schema.py b/bsfs/schema/schema.py
index 1644926..0de4203 100644
--- a/bsfs/schema/schema.py
+++ b/bsfs/schema/schema.py
@@ -69,6 +69,7 @@ class Schema():
literals.add(types.ROOT_LITERAL)
predicates.add(types.ROOT_PREDICATE)
# add minimally necessary types to the schema
+ literals.add(types.ROOT_BLOB)
literals.add(types.ROOT_NUMBER)
literals.add(types.ROOT_TIME)
literals.add(types.ROOT_ARRAY)
diff --git a/bsfs/schema/types.py b/bsfs/schema/types.py
index 3a2e10c..12e7e94 100644
--- a/bsfs/schema/types.py
+++ b/bsfs/schema/types.py
@@ -380,6 +380,11 @@ ROOT_LITERAL = Literal(
parent=None,
)
+ROOT_BLOB = Literal(
+ uri=ns.bsfs.BinaryBlob,
+ parent=ROOT_LITERAL,
+ )
+
ROOT_NUMBER = Literal(
uri=ns.bsfs.Number,
parent=ROOT_LITERAL,
diff --git a/bsfs/triple_store/sparql/sparql.py b/bsfs/triple_store/sparql/sparql.py
index a0dd12e..dbf9d45 100644
--- a/bsfs/triple_store/sparql/sparql.py
+++ b/bsfs/triple_store/sparql/sparql.py
@@ -5,8 +5,11 @@ A copy of the license is provided with the project.
Author: Matthias Baumgartner, 2022
"""
# imports
+import base64
import itertools
import typing
+
+# external imports
import rdflib
# bsfs imports
@@ -30,6 +33,8 @@ __all__: typing.Sequence[str] = (
## code ##
+rdflib.term.bind(ns.bsfs.BinaryBlob, bytes, constructor=base64.b64decode)
+
class _Transaction():
"""Lightweight rdflib transactions for in-memory databases."""
@@ -242,7 +247,7 @@ class SparqlStore(base.TripleStoreBase):
) -> typing.Iterator[URI]:
if node_type not in self.schema.nodes():
raise errors.ConsistencyError(f'{node_type} is not defined in the schema')
- if not isinstance(filter, ast.filter.FilterExpression):
+ if filter is not None and not isinstance(filter, ast.filter.FilterExpression):
raise TypeError(filter)
# compose query
query = self._filter_parser(node_type, filter)
@@ -334,7 +339,11 @@ class SparqlStore(base.TripleStoreBase):
guid = rdflib.URIRef(guid)
# convert value
if isinstance(predicate.range, bsc.Literal):
- value = rdflib.Literal(value, datatype=rdflib.URIRef(predicate.range.uri))
+ dtype = rdflib.URIRef(predicate.range.uri)
+ if predicate.range <= self.schema.literal(ns.bsfs.BinaryBlob):
+ dtype = rdflib.URIRef(ns.bsfs.BinaryBlob)
+ value = base64.b64encode(value)
+ value = rdflib.Literal(value, datatype=dtype)
elif isinstance(predicate.range, bsc.Node):
value = rdflib.URIRef(value)
else: