in src/graph_notebook/magics/graph_magic.py [0:0]
def seed(self, line):
parser = argparse.ArgumentParser()
parser.add_argument('--model', type=str, default='', choices=SEED_LANGUAGE_OPTIONS)
parser.add_argument('--dataset', type=str, default='')
# TODO: Gremlin api paths are not yet supported.
parser.add_argument('--path', '-p', default=SPARQL_ACTION,
help='prefix path to query endpoint. For example, "foo/bar". '
'The queried path would then be host:port/foo/bar for sparql seed commands')
parser.add_argument('--run', action='store_true')
parser.add_argument('--ignore-errors', action='store_true', default=False,
help='Continue loading from the seed file on failure of any individual query.')
args = parser.parse_args(line.split())
output = widgets.Output()
progress_output = widgets.Output()
model_dropdown = widgets.Dropdown(
options=SEED_LANGUAGE_OPTIONS,
description='Data model:',
disabled=False
)
data_set_drop_down = widgets.Dropdown(
description='Data set:',
disabled=False
)
submit_button = widgets.Button(description="Submit")
data_set_drop_down.layout.visibility = 'hidden'
submit_button.layout.visibility = 'hidden'
def on_value_change(change):
selected_model = change['new']
data_sets = get_data_sets(selected_model)
data_sets.sort()
data_set_drop_down.options = [ds for ds in data_sets if
ds != '__pycache__'] # being extra sure that we aren't passing __pycache__.
data_set_drop_down.layout.visibility = 'visible'
submit_button.layout.visibility = 'visible'
return
def on_button_clicked(b=None):
submit_button.close()
model_dropdown.disabled = True
data_set_drop_down.disabled = True
model = normalize_model_name(model_dropdown.value)
data_set = data_set_drop_down.value.lower()
with output:
print(f'Loading data set {data_set} for {model}')
queries = get_queries(model, data_set)
if len(queries) < 1:
with output:
print('Did not find any queries for the given dataset')
return
load_index = 1 # start at 1 to have a non-empty progress bar
progress = widgets.IntProgress(
value=load_index,
min=0,
max=len(queries) + 1, # len + 1 so we can start at index 1
orientation='horizontal',
bar_style='info',
description='Loading:'
)
with progress_output:
display(progress)
error_count = 0
any_errors_flag = False
for q in queries:
with output:
print(f'{progress.value}/{len(queries)}:\t{q["name"]}')
if model == 'propertygraph':
# IMPORTANT: We treat each line as its own query!
for line_index, line in enumerate(q['content'].splitlines()):
if not line:
logger.debug(f"Skipped blank query at line {line_index + 1} in seed file {q['name']}")
continue
try:
self.client.gremlin_query(line)
except GremlinServerError as gremlinEx:
any_errors_flag = True
error_count += 1
try:
error = json.loads(gremlinEx.args[0][5:]) # remove the leading error code.
content = json.dumps(error, indent=2)
except Exception:
content = {
'error': gremlinEx
}
logger.debug(f"GremlinServerError at line {line_index + 1} in seed file {q['name']}")
logger.debug(content)
if args.ignore_errors:
continue
else:
with output:
generate_seed_error_msg(content, q['name'], line_index + 1)
progress.close()
return
except Exception as e:
any_errors_flag = True
error_count += 1
content = {
'error': e
}
logger.debug(f"Exception at line {line_index + 1} in seed file {q['name']}")
logger.debug(content)
if args.ignore_errors:
continue
else:
with output:
generate_seed_error_msg(content, q['name'], line_index + 1)
progress.close()
return
else:
try:
self.client.sparql(q['content'], path=args.path)
except HTTPError as httpEx:
# attempt to turn response into json
try:
error = json.loads(httpEx.response.content.decode('utf-8'))
content = json.dumps(error, indent=2)
except Exception:
any_errors_flag = True
error_count += 1
content = {
'error': httpEx
}
logger.debug(content)
if args.ignore_errors:
continue
else:
with output:
generate_seed_error_msg(content, q['name'])
progress.close()
return
except Exception as ex:
any_errors_flag = True
error_count += 1
content = {
'error': str(ex)
}
logger.error(content)
if args.ignore_errors:
continue
else:
with output:
generate_seed_error_msg(content, q['name'])
progress.close()
return
progress.value += 1
# Sleep for two seconds so the user sees the progress bar complete
time.sleep(2)
progress.close()
with output:
print('Done.')
if any_errors_flag:
print(f'\n{error_count} individual queries were skipped due to errors. For more '
f'information, please rerun the query with debug logs enabled (%enable_debug).')
return
submit_button.on_click(on_button_clicked)
model_dropdown.observe(on_value_change, names='value')
display(model_dropdown, data_set_drop_down, submit_button, progress_output, output)
if args.model != '':
model_dropdown.value = args.model
if args.dataset != '' and args.dataset in data_set_drop_down.options:
data_set_drop_down.value = args.dataset.lower()
if args.run:
on_button_clicked()