Skip to content

Commit 43f37a2

Browse files
committed
Skip invalid uris when serializing to rdf.
1 parent bdbbf72 commit 43f37a2

1 file changed

Lines changed: 23 additions & 9 deletions

File tree

lib/pyld/jsonld.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
from rdflib.parser import StringInputSource
3838
from rdflib.plugins.parsers.nquads import NQuadsParser
3939
from rdflib.plugins.serializers.nquads import _nq_row
40-
from rdflib.term import Identifier
40+
from rdflib.term import Identifier, _is_valid_uri
4141

4242
from c14n.Canonicalize import canonicalize
4343
from pyld.__about__ import __copyright__, __license__, __version__
@@ -1032,7 +1032,7 @@ def to_rdf(self, input_, options):
10321032
dataset = Dataset()
10331033
for graph_name, graph in sorted(node_map.items()):
10341034
# skip relative IRIs
1035-
if graph_name == '@default' or _is_absolute_iri(graph_name):
1035+
if graph_name == '@default' or _is_valid_absolute_iri(graph_name):
10361036
g = self._rdflib_term_from_id(graph_name) if graph_name != '@default' else dataset.default_graph
10371037
for t in self._graph_to_rdf(graph, issuer, options):
10381038
s, p, o = t
@@ -3861,8 +3861,8 @@ def _graph_to_rdf(self, graph, issuer, options):
38613861

38623862
for item in items:
38633863
# skip relative IRI subjects and predicates
3864-
if not _is_absolute_iri(id_) or (
3865-
property != '@type' and not _is_absolute_iri(property)
3864+
if not _is_valid_absolute_iri(id_) or (
3865+
property != '@type' and not _is_valid_absolute_iri(property)
38663866
):
38673867
continue
38683868

@@ -3900,21 +3900,23 @@ def _list_to_rdf(self, list_: list, issuer: IdentifierIssuer, triples, options)
39003900

39013901
last = list_.pop() if list_ else None
39023902
# result is the head of the list
3903-
result = BNode(issuer.get_id()) if last else RDF.nil
3903+
result = self._rdflib_term_from_id(issuer.get_id()) if last else RDF.nil
39043904
subject = result
39053905

39063906
for item in list_:
39073907
object = self._object_to_rdf(item, issuer, triples, options)
3908-
next = BNode(issuer.get_id())
3909-
triples.append((subject, RDF.first, object))
3908+
next = self._rdflib_term_from_id(issuer.get_id())
3909+
if object is not None:
3910+
triples.append((subject, RDF.first, object))
39103911
triples.append((subject, RDF.rest, next))
39113912

39123913
subject = next
39133914

39143915
# tail of list
39153916
if last:
39163917
object = self._object_to_rdf(last, issuer, triples, options)
3917-
triples.append((subject, RDF.first, object))
3918+
if object is not None:
3919+
triples.append((subject, RDF.first, object))
39183920
triples.append((subject, RDF.rest, RDF.nil))
39193921

39203922
return result
@@ -4060,7 +4062,7 @@ def _object_to_rdf(self, item, issuer, triples, options):
40604062
id_ = item['@id'] if _is_object(item) else item
40614063

40624064
# skip relative IRIs
4063-
if not id_.startswith('_:') and not _is_absolute_iri(id_):
4065+
if not id_.startswith('_:') and not _is_valid_absolute_iri(id_):
40644066
return None
40654067

40664068
return self._rdflib_term_from_id(id_)
@@ -6558,6 +6560,18 @@ def _is_absolute_iri(v):
65586560
return _is_string(v) and re.match(r'^([A-Za-z][A-Za-z0-9+-.]*|_):[^\s]*$', v)
65596561

65606562

6563+
def _is_valid_absolute_iri(v):
6564+
"""
6565+
Returns True if the given value is an absolute IRI that RDFLib can
6566+
serialize, False if not.
6567+
6568+
:param v: the value to check.
6569+
6570+
:return: True if the value is a valid absolute IRI, False if not.
6571+
"""
6572+
return _is_absolute_iri(v) and _is_valid_uri(v)
6573+
6574+
65616575
def _is_relative_iri(v):
65626576
"""
65636577
Returns true if the given value is a relative IRI, false if not.

0 commit comments

Comments
 (0)