Просмотр исходного кода

Add option to perform data insertion queries

Arkadiusz Ryś 2 лет назад
Родитель
Сommit
c76d9bf32a

+ 1 - 0
data/configuration.toml

@@ -1,5 +1,6 @@
 endpoint_sparql = "http://127.0.0.1:3030/Drivetrain/sparql" # Fuseki SPARQL endpoint for the drivetrain
 #endpoint_sparql = "http://127.0.0.1:8000/"
+#endpoint_sparql = "https://fuseki.rys.app/example/"
 example_prefix = '''
 PREFIX xsd:  <http://www.w3.org/2001/XMLSchema#>
 PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

+ 1 - 1
data/palette/conversion_function.toml

@@ -28,7 +28,7 @@ SELECT ?conversion ?conversion_input ?conversion_output ?conversion_duration ?co
   BIND(dtf:conversion("{{ input_file }}", "{{ output_file }}") AS ?conversion)
 }
 '''
-q_wi_serivece = '''
+query_with_service = '''
 SELECT ?conversion ?conversion_input ?conversion_output ?conversion_duration ?conversion_success WHERE {
   SERVICE <http://localhost:8000/> {
     BIND(dtf:conversion("{{ input_file }}", "{{ output_file }}") AS ?conversion)

+ 44 - 0
data/palette/create_example.toml

@@ -0,0 +1,44 @@
+group = "Insert"
+name = "Create Example"
+prefix = '''
+PREFIX dtf:        <https://ontology.rys.app/dt/function/>
+PREFIX owl:        <http://www.w3.org/2002/07/owl#>
+PREFIX rdf:        <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+PREFIX xsd:        <http://www.w3.org/2001/XMLSchema#>
+PREFIX rdfs:       <http://www.w3.org/2000/01/rdf-schema#>
+PREFIX art:        <http://ua.be/drivetrain/description/artifacts/artifacts#>
+PREFIX tabular:    <http://ua.be/sdo2l/vocabulary/base/tabular#>
+PREFIX dc:         <http://purl.org/dc/elements/1.1/>
+PREFIX ftg:        <http://ua.be/sdo2l/vocabulary/ftg#>
+PREFIX base:       <http://ua.be/sdo2l/vocabulary/base#>
+PREFIX vim4:       <http://bipm.org/jcgm/vim4#>
+PREFIX comp:       <http://ua.be/sdo2l/vocabulary/component#>
+PREFIX code:       <http://ua.be/sdo2l/vocabulary/base/code#>
+PREFIX script:     <http://ua.be/sdo2l/vocabulary/base/script#>
+PREFIX file:       <http://ua.be/sdo2l/vocabulary/base/file#>
+PREFIX swrl:       <http://www.w3.org/2003/11/swrl#>
+PREFIX traces:     <http://ua.be/sdo2l/vocabulary/processtraces#>
+PREFIX wf:         <http://ua.be/sdo2l/vocabulary/workflow#>
+PREFIX text:       <http://ua.be/sdo2l/vocabulary/base/text#>
+PREFIX federation: <http://ua.be/sdo2l/vocabulary/federation#>
+PREFIX dftg:       <http://ua.be/drivetrain/description/ftg#>
+'''
+# https://codyburleson.com/blog/sparql-examples-insert
+query = '''
+INSERT DATA {
+  text:example_text_artifact base:hasVersion "v4" .
+}
+'''
+query_with_where = '''
+INSERT {
+  GRAPH <text:example_text_artifact> {
+    ?book base:hasVersion "v0" .
+  }
+} WHERE {
+  ?book dcterms:author ?author .
+  ?author dcterms:name "author"
+}
+'''
+description = "Insert data into the VKG."
+visual_support = true
+modifies = true

+ 15 - 4
graph_exploring_tool/graphical/interface.py

@@ -68,8 +68,13 @@ def create_query_palette(query_palette: List[QueryTemplate]):
                             with dpg.theme_component(dpg.mvAll):
                                 dpg.add_theme_color(dpg.mvThemeCol_Text, (200, 200, 100), category=dpg.mvThemeCat_Core)
                                 dpg.add_theme_style(dpg.mvStyleVar_FrameRounding, 0, category=dpg.mvThemeCat_Core)
+                        with dpg.theme() as modifies_theme:
+                            with dpg.theme_component(dpg.mvAll):
+                                dpg.add_theme_color(dpg.mvThemeCol_Text, (200, 50, 50), category=dpg.mvThemeCat_Core)
                         if query_template.visual_support:
                             dpg.bind_item_theme(query_button, item_theme)
+                        if query_template.modifies:
+                            dpg.bind_item_theme(query_button, modifies_theme)
                     dpg.configure_item(query_template_group, filter_key=full_filter)
 
 def create_query_options(endpoint: str):
@@ -90,6 +95,8 @@ def create_query_editor_visual(example_prefix:str, example_query:str, show: bool
                 dpg.add_input_text(default_value=example_query, callback=_log, multiline=True, on_enter=True, height=300, width=-1, tag="__query_editor_visual_input")
             with dpg.tab(label="Prefix", tag="__prefix_tab"):
                 dpg.add_input_text(default_value=example_prefix, callback=_log, multiline=True, on_enter=True, height=300, width=-1, tag="__prefix_editor_visual_input")
+            with dpg.tab(label="Advanced", tag="__advanced_tab"):
+                dpg.add_checkbox(label="Use post method", default_value=False, tag="__use_post_method")
         with dpg.group(tag="__visual_editor_fields"):
             # TODO Make more clear which placeholder is getting replaced (Maybe do it interactively, replace as user changes)
             pass
@@ -156,9 +163,6 @@ def create_query_results():
 def _log(sender: int, app_data: str, user_data: Optional[dict]):
     logging.debug(f"sender: {sender}, \t app_data: {app_data}, \t user_data: {user_data}")
 
-def _perform_text_query(sender: int, app_data: str, user_data: Optional[dict]):
-    logging.debug(f"sender: {sender}, \t app_data: {app_data}, \t user_data: {user_data}")
-
 def _mode_select(sender: int, mode: str, user_data: Optional[dict]):
     mode = mode.lower().strip()
     visual = mode == "visual"
@@ -180,6 +184,7 @@ def _query_palette_click(sender: int, mode: str, user_data: Optional[QueryTempla
     dpg.set_value("__status_console", f"Using {mode} template '{user_data.name}'.")
     dpg.set_value(f"__prefix_editor_{mode}_input", user_data.prefix)
     dpg.set_value(f"__query_editor_{mode}_input", user_data.query)
+    dpg.set_value(f"__use_post_method", user_data.modifies)
     dpg.delete_item("__visual_editor_fields", children_only=True)
     if mode == "visual" and user_data.visual_support:
         for replacement in user_data.replacements:
@@ -191,17 +196,23 @@ def _perform_query(sender: int, mode: str, user_data: Optional[dict]):
     prefix_text = dpg.get_value(f"__prefix_editor_{mode}_input")
     query_text = dpg.get_value(f"__query_editor_{mode}_input")
     endpoint = dpg.get_value("__endpoint_input")
+    use_post_method = dpg.get_value("__use_post_method")
     try:
         if mode=="visual":
             for replacement_field in dpg.get_item_children("__visual_editor_fields", 1):
                 value = dpg.get_value(replacement_field)
                 placeholder = dpg.get_item_user_data(replacement_field).placeholder
                 query_text = query_text.replace(f"{{{{ {placeholder} }}}}", value)
-        query_result = query.perform_query(endpoint, prefix_text + "\n" + query_text)
+        query_result = query.perform_query(endpoint, prefix_text + "\n" + query_text, use_post_method)
     except URLError as e:
         logging.error(f"Connection to '{endpoint}' failed.")
         dpg.set_value(f"__status_console", f"Connection to '{endpoint}' failed.")
         return
+    if use_post_method:
+        logging.debug(f"{query_result}")
+        if query_result:
+            dpg.set_value(f"__status_console", f"{query_result}")
+        return
     result_items = query_result["results"]["bindings"]
     if not result_items:
         dpg.delete_item("__result_table", children_only=True) # TODO Clear table https://github.com/hoffstadt/DearPyGui/issues/1350

+ 5 - 2
graph_exploring_tool/query.py

@@ -3,7 +3,7 @@ from typing import List
 from urllib.error import URLError
 
 import arklog
-from SPARQLWrapper import SPARQLWrapper, JSON
+from SPARQLWrapper import SPARQLWrapper, JSON, POSTDIRECTLY
 from SPARQLWrapper.SPARQLExceptions import QueryBadFormed
 
 arklog.set_config_logging()
@@ -23,6 +23,7 @@ class QueryTemplate:
     description: str
     visual_support: bool = False
     replacements: List[Replacement] = field(default_factory=list)
+    modifies: bool = False
 
 # TODO Rewrite this
 reverse_prefix = {
@@ -49,10 +50,12 @@ reverse_prefix = {
     "http://ua.be/drivetrain/description/ftg#": "dftg",
 }
 
-def perform_query(endpoint: str, query_text: str) -> dict:
+def perform_query(endpoint: str, query_text: str, post: bool = False) -> dict:
     """"""
     sparql = SPARQLWrapper(endpoint)
     sparql.setReturnFormat(JSON)
+    if post:
+        sparql.setRequestMethod(POSTDIRECTLY)
     sparql.setQuery(query_text)
     try:
         ret = sparql.query().convert()