77from sys import stderr
88from typing import Dict , List , Optional , Tuple , Union
99
10- from rdflib import ConjunctiveGraph , Dataset , Graph , Literal , URIRef
10+ from rdflib import Dataset , Graph , Literal , URIRef
1111
1212from pyshacl .errors import ReportableRuntimeError , ValidationFailure
1313from pyshacl .pytypes import GraphLike
1414
1515from .consts import SH , RDF_type
16+ from .graph_abstraction import DataGraph , has_oxigraph , ox_Store
1617from .monkey import apply_patches , rdflib_bool_patch , rdflib_bool_unpatch
1718from .rdfutil import load_from_source
1819from .rule_expand_runner import RuleExpandRunner
1920from .validator import Validator , assign_baked_in
2021from .validator_conformance import check_dash_result
2122
22- DataGraphInput = Union [GraphLike , BufferedIOBase , TextIOBase , str , bytes ]
23+ DataGraphInput = Union [DataGraph , GraphLike , BufferedIOBase , TextIOBase , str , bytes ]
2324MultiDataGraphInput = Sequence [DataGraphInput ]
2425
2526
2627def _is_multi_data_graph_input (data_graph : object ) -> bool :
27- if isinstance (data_graph , (str , bytes , BufferedIOBase , TextIOBase , Graph , Dataset , ConjunctiveGraph )):
28+ if isinstance (data_graph , (str , bytes , DataGraph , BufferedIOBase , TextIOBase , Graph , Dataset )):
2829 return False
2930 return isinstance (data_graph , (tuple , list , set , frozenset , Sequence ))
3031
3132
32- def _multi_data_graph_key (source : DataGraphInput ) -> Union [str , URIRef ]:
33- if isinstance (source , (Graph , Dataset , ConjunctiveGraph )):
34- return source .identifier
35- if isinstance (source , (BufferedIOBase , TextIOBase )):
36- return getattr (source , "name" , repr (source ))
37- if isinstance (source , bytes ):
38- try :
39- return source .decode ("utf-8" )
40- except UnicodeDecodeError :
41- return repr (source )
42- return str (source )
43-
44-
4533def validate (
4634 data_graph : Union [DataGraphInput , MultiDataGraphInput ],
4735 * args ,
@@ -127,12 +115,12 @@ def validate(
127115 sparql_mode = sparql_mode ,
128116 focus_nodes = focus_nodes ,
129117 use_shapes = use_shapes ,
130- multi_data_graphs_mode = resolved_mode ,
131118 ** kwargs ,
132119 )
133120 if len (data_graphs ) == 1 :
134121 data_graph = data_graphs [0 ]
135122 else :
123+ # Combined mode, load all the sources into a single dataset
136124 data_graph_format = kwargs .get ('data_graph_format' , None )
137125 combined_dataset = Dataset (default_union = True )
138126 for source in data_graphs :
@@ -145,7 +133,7 @@ def validate(
145133 logger = log ,
146134 )
147135 data_graph = combined_dataset
148- do_check_dash_result = kwargs .pop ('check_dash_result' , False ) # type: bool
136+ do_check_dash_result : bool = kwargs .pop ('check_dash_result' , False )
149137 if kwargs .get ('meta_shacl' , False ):
150138 to_meta_val = shacl_graph or data_graph
151139 conforms , v_r , v_t = meta_validate (to_meta_val , inference = inference , ** kwargs )
@@ -173,8 +161,6 @@ def validate(
173161 raise ReportableRuntimeError ("Cannot use SPARQL Remote Graph Mode with extra Ontology Graph inoculation." )
174162 if isinstance (data_graph , bytes ):
175163 data_graph = data_graph .decode ('utf-8' )
176- else :
177- data_graph = data_graph
178164 ephemeral = False
179165 inplace = True
180166 if (
@@ -195,11 +181,19 @@ def validate(
195181 auth = None
196182 store = SPARQLStore (query_endpoint = query_endpoint , auth = auth , method = method )
197183 loaded_dg = Dataset (store = store , default_union = True )
184+ dg = DataGraph .from_rdflib_dataset (loaded_dg )
185+ elif isinstance (data_graph , DataGraph ):
186+ loaded_dg = data_graph .impl
187+ dg = data_graph
188+ elif has_oxigraph and isinstance (data_graph , ox_Store ):
189+ loaded_dg = data_graph
190+ dg = DataGraph .from_oxigraph_store (loaded_dg )
198191 else :
199192 # force no owl imports on data_graph
200193 loaded_dg = load_from_source (
201194 data_graph , rdf_format = data_graph_format , multigraph = True , do_owl_imports = False , logger = log
202195 )
196+ dg = DataGraph .from_rdflib (loaded_dg )
203197 ont_graph_format = kwargs .pop ('ont_graph_format' , None )
204198 if ont_graph is not None :
205199 loaded_og = load_from_source (
@@ -241,7 +235,7 @@ def validate(
241235 validator = None
242236 try :
243237 validator = Validator (
244- loaded_dg ,
238+ dg ,
245239 shacl_graph = loaded_sg ,
246240 ont_graph = loaded_og ,
247241 options = validator_options_dict ,
@@ -252,7 +246,7 @@ def validate(
252246 report_graph = e
253247 report_text = "Validation Failure - {}" .format (e .message )
254248 if do_check_dash_result and validator is not None :
255- passes = check_dash_result (validator , report_graph , loaded_sg or loaded_dg )
249+ passes = check_dash_result (validator , report_graph , loaded_sg or dg )
256250 return passes , report_graph , report_text
257251 do_serialize_report_graph = kwargs .pop ('serialize_report_graph' , False )
258252 if do_serialize_report_graph and isinstance (report_graph , Graph ):
@@ -277,24 +271,23 @@ def validate_each(
277271 sparql_mode : Optional [bool ] = False ,
278272 focus_nodes : Optional [List [Union [str , URIRef ]]] = None ,
279273 use_shapes : Optional [List [Union [str , URIRef ]]] = None ,
280- multi_data_graphs_mode : Optional [str ] = None ,
281274 ** kwargs ,
282- ) -> Dict [Union [ str , URIRef ] , Tuple [bool , Union [GraphLike , bytes , ValidationFailure ], str ]]:
275+ ) -> Dict [int , Tuple [bool , Union [GraphLike , bytes , ValidationFailure ], str ]]:
283276 """
284277 :param data_graphs: Sequence of data graphs or sources to validate independently
285278 :type data_graphs: Sequence
286279 :param multi_data_graphs_mode: Optional mode hint for compatibility with validate()
287280 :type multi_data_graphs_mode: str | None
288- :return: dict mapping each input graph identifier to its validation results
281+ :return: dict mapping each input graph index to its validation results
289282 """
290283
291284 if not _is_multi_data_graph_input (data_graphs ):
292285 raise ReportableRuntimeError ("validate_each expects a sequence of data graphs to validate." )
293286 data_graph_list = list (data_graphs )
294287 if len (data_graph_list ) < 1 :
295288 raise ReportableRuntimeError ("No data graphs were provided for validate_each." )
296- results : Dict [Union [ str , URIRef ] , Tuple [bool , Union [GraphLike , bytes , ValidationFailure ], str ]] = {}
297- for data_graph in data_graph_list :
289+ results : Dict [int , Tuple [bool , Union [GraphLike , bytes , ValidationFailure ], str ]] = {}
290+ for datagraph_i , data_graph in enumerate ( data_graph_list ) :
298291 result = validate (
299292 data_graph ,
300293 * args ,
@@ -310,10 +303,9 @@ def validate_each(
310303 sparql_mode = sparql_mode ,
311304 focus_nodes = focus_nodes ,
312305 use_shapes = use_shapes ,
313- multi_data_graphs_mode = multi_data_graphs_mode ,
314306 ** kwargs ,
315307 )
316- results [_multi_data_graph_key ( data_graph ) ] = result
308+ results [datagraph_i ] = result
317309 return results
318310
319311
@@ -416,10 +408,18 @@ def shacl_rules(
416408 else :
417409 ephemeral = False
418410 use_js = kwargs .pop ('js' , None )
419- # force no owl imports on data_graph
420- loaded_dg = load_from_source (
421- data_graph , rdf_format = data_graph_format , multigraph = True , do_owl_imports = False , logger = log
422- )
411+ if isinstance (data_graph , DataGraph ):
412+ loaded_dg = data_graph .impl
413+ dg = data_graph
414+ elif has_oxigraph and isinstance (data_graph , ox_Store ):
415+ loaded_dg = data_graph
416+ dg = DataGraph .from_oxigraph_store (loaded_dg )
417+ else :
418+ # force no owl imports on data_graph
419+ loaded_dg = load_from_source (
420+ data_graph , rdf_format = data_graph_format , multigraph = True , do_owl_imports = False , logger = log
421+ )
422+ dg = DataGraph .from_rdflib (loaded_dg )
423423 ont_graph_format = kwargs .pop ('ont_graph_format' , None )
424424 if ont_graph is not None :
425425 loaded_og = load_from_source (
@@ -450,7 +450,7 @@ def shacl_rules(
450450 serialize_expanded_graph = kwargs .get ('serialize_expanded_graph' , None )
451451 try :
452452 runner = RuleExpandRunner (
453- loaded_dg ,
453+ dg ,
454454 shacl_graph = loaded_sg ,
455455 ont_graph = loaded_og ,
456456 options = runner_options_dict ,
@@ -466,7 +466,7 @@ def shacl_rules(
466466 g .add ((URIRef ("<urn:rdflib:pyshacl:shacl-rules-error>" ), SH .message , Literal (error )))
467467 return g
468468 if serialize_expanded_graph :
469- guess_format = "trig" if isinstance (expanded_graph , ( Dataset , ConjunctiveGraph ) ) else "turtle"
469+ guess_format = "trig" if isinstance (expanded_graph , Dataset ) else "turtle"
470470 serialize_format = kwargs .get ('serialize_expanded_graph_format' , guess_format )
471471 return expanded_graph .serialize (format = serialize_format )
472472 return expanded_graph
0 commit comments