Skip to content

Commit dd3c44c

Browse files
committed
Merge pull request #503 from joernhees/fix_from_n3
fix util.from_n3() parsing Literals with datatypes and Namespace support, fixes #502
2 parents 4e257e4 + 693e947 commit dd3c44c

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

rdflib/util.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
from rdflib.exceptions import SubjectTypeError
4747
from rdflib.graph import Graph
4848
from rdflib.graph import QuotedGraph
49+
from rdflib.namespace import Namespace
50+
from rdflib.namespace import NamespaceManager
4951
from rdflib.term import BNode
5052
from rdflib.term import Literal
5153
from rdflib.term import URIRef
@@ -122,7 +124,7 @@ def to_term(s, default=None):
122124
raise Exception(msg)
123125

124126

125-
def from_n3(s, default=None, backend=None):
127+
def from_n3(s, default=None, backend=None, nsm=None):
126128
r'''
127129
Creates the Identifier corresponding to the given n3 string.
128130
@@ -135,10 +137,20 @@ def from_n3(s, default=None, backend=None):
135137
True
136138
>>> from_n3('42') == Literal(42)
137139
True
140+
>>> from_n3(Literal(42).n3()) == Literal(42)
141+
True
142+
>>> from_n3('"42"^^xsd:integer') == Literal(42)
143+
True
144+
>>> from rdflib import RDFS
145+
>>> from_n3('rdfs:label') == RDFS['label']
146+
True
147+
>>> nsm = NamespaceManager(Graph())
148+
>>> nsm.bind('dbpedia', 'http://dbpedia.org/resource/')
149+
>>> berlin = URIRef('http://dbpedia.org/resource/Berlin')
150+
>>> from_n3('dbpedia:Berlin', nsm=nsm) == berlin
151+
True
138152
139153
'''
140-
# TODO: should be able to handle prefixes given as opt. argument maybe:
141-
# from_n3('rdfs:label')
142154
if not s:
143155
return default
144156
if s.startswith('<'):
@@ -160,7 +172,7 @@ def from_n3(s, default=None, backend=None):
160172
# datatype has to come after lang-tag so ignore everything before
161173
# see: http://www.w3.org/TR/2011/WD-turtle-20110809/
162174
# #prod-turtle2-RDFLiteral
163-
datatype = rest[dtoffset + 2:]
175+
datatype = from_n3(rest[dtoffset + 2:], default, backend, nsm)
164176
else:
165177
if rest.startswith("@"):
166178
language = rest[1:] # strip leading at sign
@@ -180,11 +192,17 @@ def from_n3(s, default=None, backend=None):
180192
elif s.startswith('['):
181193
identifier = from_n3(s[1:-1])
182194
return Graph(backend, identifier)
195+
elif s.startswith("_:"):
196+
return BNode(s[2:])
197+
elif ':' in s:
198+
if nsm is None:
199+
# instantiate default NamespaceManager and rely on its defaults
200+
nsm = NamespaceManager(Graph())
201+
prefix, last_part = s.split(':', 1)
202+
ns = dict(nsm.namespaces())[prefix]
203+
return Namespace(ns)[last_part]
183204
else:
184-
if s.startswith("_:"):
185-
return BNode(s[2:])
186-
else:
187-
return BNode(s)
205+
return BNode(s)
188206

189207

190208
def check_context(c):

test/test_util.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from rdflib.term import Literal
88
from rdflib.term import URIRef
99
from rdflib import util
10+
from rdflib import XSD
1011
from rdflib.exceptions import SubjectTypeError
1112
from rdflib.exceptions import PredicateTypeError
1213
from rdflib.exceptions import ObjectTypeError
@@ -193,13 +194,13 @@ def test_util_from_n3_expectliteralandlangdtype(self):
193194
res = util.from_n3(s, default=None, backend=None)
194195
self.assert_(isinstance(res, Literal))
195196
self.assertEqual(res, Literal('michel',
196-
datatype=URIRef('xsd:fr')))
197-
197+
datatype=XSD['fr']))
198+
198199
def test_util_from_n3_expectliteralanddtype(self):
199200
s = '"true"^^xsd:boolean'
200201
res = util.from_n3(s, default=None, backend=None)
201-
self.assertTrue(res.eq(Literal('true', datatype='xsd:boolean')))
202-
202+
self.assertTrue(res.eq(Literal('true', datatype=XSD['boolean'])))
203+
203204
def test_util_from_n3_expectliteralwithdatatypefromint(self):
204205
s = '42'
205206
res = util.from_n3(s)
@@ -263,12 +264,12 @@ def parse_n3(term_n3):
263264

264265

265266
def test_util_from_n3_expectquotedgraph(self):
266-
s = '{http://example.com/schema}'
267+
s = '{<http://example.com/schema>}'
267268
res = util.from_n3(s, default=None, backend="IOMemory")
268269
self.assert_(isinstance(res, QuotedGraph))
269270

270271
def test_util_from_n3_expectgraph(self):
271-
s = '[http://example.com/schema]'
272+
s = '[<http://example.com/schema>]'
272273
res = util.from_n3(s, default=None, backend="IOMemory")
273274
self.assert_(isinstance(res, Graph))
274275

0 commit comments

Comments
 (0)