46
46
from rdflib .exceptions import SubjectTypeError
47
47
from rdflib .graph import Graph
48
48
from rdflib .graph import QuotedGraph
49
+ from rdflib .namespace import Namespace
50
+ from rdflib .namespace import NamespaceManager
49
51
from rdflib .term import BNode
50
52
from rdflib .term import Literal
51
53
from rdflib .term import URIRef
@@ -122,7 +124,7 @@ def to_term(s, default=None):
122
124
raise Exception (msg )
123
125
124
126
125
- def from_n3 (s , default = None , backend = None ):
127
+ def from_n3 (s , default = None , backend = None , nsm = None ):
126
128
r'''
127
129
Creates the Identifier corresponding to the given n3 string.
128
130
@@ -135,10 +137,20 @@ def from_n3(s, default=None, backend=None):
135
137
True
136
138
>>> from_n3('42') == Literal(42)
137
139
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
138
152
139
153
'''
140
- # TODO: should be able to handle prefixes given as opt. argument maybe:
141
- # from_n3('rdfs:label')
142
154
if not s :
143
155
return default
144
156
if s .startswith ('<' ):
@@ -160,7 +172,7 @@ def from_n3(s, default=None, backend=None):
160
172
# datatype has to come after lang-tag so ignore everything before
161
173
# see: http://www.w3.org/TR/2011/WD-turtle-20110809/
162
174
# #prod-turtle2-RDFLiteral
163
- datatype = rest [dtoffset + 2 :]
175
+ datatype = from_n3 ( rest [dtoffset + 2 :], default , backend , nsm )
164
176
else :
165
177
if rest .startswith ("@" ):
166
178
language = rest [1 :] # strip leading at sign
@@ -180,11 +192,17 @@ def from_n3(s, default=None, backend=None):
180
192
elif s .startswith ('[' ):
181
193
identifier = from_n3 (s [1 :- 1 ])
182
194
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 ]
183
204
else :
184
- if s .startswith ("_:" ):
185
- return BNode (s [2 :])
186
- else :
187
- return BNode (s )
205
+ return BNode (s )
188
206
189
207
190
208
def check_context (c ):
0 commit comments