{% import "macros/renderers.html" as renderers %} {# select the graphs to fingerprint: either the ones grom the config file or all from the endpoint #} {% macro select_graphs() -%} {# caller_ is a workaround necessary to handle two levels of callers #} {% set caller_ = caller %} {# if there are some graphs defined in the configuration, then select those #} {% if conf.selected_graphs %} {% for graph in conf.selected_graphs | unique | list %} {% if graph %} {{ caller_(graph) }} {% else %} {{ caller_(None) }} {% endif %} {% endfor %} {% else %} {# if no graphs are defined in the configurations, then select all the graphs in the endpoint #} {% set select_query = "select distinct ?graph {graph ?graph {?s ?p []}} ORDER BY ?graph" %} {% set content, error = from_endpoint(conf.default_endpoint).with_query(select_query).fetch_tabular() %} {# Fingerpring the gefault graph before going to named graphs #} {{ caller_(None) }} {% call renderers.render_fetch_results(content, error) %} {% if not content.empty %} {% for row in content.itertuples() %} {{ caller_(row.graph) }} {% endfor %} {% endif %} {% endcall %} {% endif %} {%- endmacro %} {# select distinct classes is the given graph #} {% macro select_distinct_classes(graph=None) -%} {% set from_statement = 'FROM <'~graph~'>' if graph else '' %} {% set select_query = "SELECT DISTINCT ?cls \n"~from_statement~" WHERE {[] a ?cls} ORDER BY ?cls" %} {% set content, error = from_endpoint(conf.default_endpoint).with_query(select_query).fetch_tabular() %} {% set caller_ = caller %} {% call renderers.render_fetch_results(content, error) %} {% if not content.empty %} {% for row in content.itertuples() %} {{ caller_(row.cls) }} {% endfor %} {% endif %} {% endcall %} {%- endmacro %} {# select distinct property given a class and graph #} {% macro select_distinct_property(class, graph=None) -%} {% set from_statement = 'FROM <'~graph~'>' if graph else '' %} {% set select_query = "SELECT DISTINCT ?property \n"~from_statement~" WHERE{ VALUES ?subject_class { <"~class~"> } ?subject a ?subject_class; ?property ?object . } ORDER BY ?property" %} {% set content, error = from_endpoint(conf.default_endpoint).with_query(select_query).fetch_tabular() %} {% set caller_ = caller %} {% call renderers.render_fetch_results(content, error) %} {% if not content.empty %} {% for row in content.itertuples() %} {{ caller_(row.property) }} {% endfor %} {% endif %} {% endcall %} {%- endmacro %} {# fingerprint a given class propeorty pattern in a given graph. If the class of the propoerty is not provided the fingerprint will be provided for the propoerty with all classes or for the class with all properties #} {% macro fingerprint_pattern(graph=None, class=None, property=None) -%} {% set from_statement = 'FROM <'~graph~'>' if graph else '' %} {% set property_statement = '<'~property~'>' if property else 'undef' %} {% set class_statement = '<'~class~'>' if class else 'undef' %} {% set select_query = "PREFIX rdf: PREFIX rdfs: PREFIX owl: # get signature and stats of the class and property pattern SELECT DISTINCT ?subject_class ?property ?subject_count ?class_instance_count ?object_count (if(?subject_count < ?class_instance_count, 0, min(?property_occurences)) as ?min) (max(?property_occurences) as ?max) (avg(?property_occurences) * ?subject_count/?class_instance_count as ?avg) ?property_types ?object_types "~from_statement~" WHERE { VALUES (?subject_class ?property) {( "~class_statement~" "~property_statement~" )} # getting the number of property occurences with each subject { SELECT DISTINCT ?subject_class ?subject1 ?property (count(*) as ?property_occurences) { ?subject1 a ?subject_class; ?property [] . } GROUP BY ?subject_class ?subject1 ?property } # getting the number of distinct subjects using the property { SELECT DISTINCT ?subject_class ?property (count(distinct ?subject2) AS ?subject_count) { ?subject2 a ?subject_class; ?property [] . } GROUP BY ?subject_class ?property } # getting the total number of individuals instanciating the class { select ?subject_class (count(distinct ?i) as ?class_instance_count) { ?i a ?subject_class } GROUP BY ?subject_class } # getting the object type(s) { SELECT ?subject_class ?property (GROUP_CONCAT(distinct ?object_type; separator=', ') as ?object_types) (GROUP_CONCAT(distinct ?property_type; separator=', ') as ?property_types) (count(distinct ?object) as ?object_count) { ?subject3 a ?subject_class; ?property ?object . OPTIONAL { ?object a ?object_class . } # binding the Object and property types BIND(datatype(?object) as ?data_type) BIND(IF(BOUND(?object_class),?object_class, IF (bound(?data_type), ?data_type, rdfs:Resource) ) as ?object_type) BIND(IF( isURI(?object) || isBlank( ?object ),owl:ObjectProperty , owl:DatatypeProperty) as ?property_type) } GROUP BY ?subject_class ?property } } GROUP BY ?subject_class ?property ?subject_count ?class_instance_count ?object_types ?property_types ?object_count " %} {% set content, error = from_endpoint(conf.default_endpoint).with_query(select_query).fetch_tabular() %} {% set caller_ = caller %} {% call renderers.render_fetch_results(content, error) %} {% if not content.empty %} {{ caller_(content) }} {% endif %} {% endcall %} {%- endmacro %} {#-----------------------------------------------------#} {# more granular fetchers, possibly useful for heavy queries #} {#-----------------------------------------------------#} {# select all the distinct (subject type, property) pairs in a given graph #} {% macro select_distinct_subject_property(graph=None) -%} {% set from_statement = 'FROM <'~graph~'>' if graph else '' %} {% set select_query = "SELECT DISTINCT ?class ?property \n"~from_statement~" WHERE {[] a ?class ; ?property [] .} ORDER BY ?class ?property " %} {% set content, error = from_endpoint(conf.default_endpoint).with_query(select_query).fetch_tabular() %} {% set caller_ = caller %} {% call renderers.render_fetch_results(content, error) %} {% if not content.empty %} {% for row in content.itertuples() %} {{ caller_(row.class, row.property) }} {% endfor %} {% endif %} {% endcall %} {%- endmacro %} {# fetch the basic stats and pattern signature #} {% macro fetch_pattern_stats(class, property, graph=None) -%} {% set from_statement = 'FROM <'~graph~'>' if graph else '' %} {% set select_query = "PREFIX skos: PREFIX skosxl: PREFIX rdf: PREFIX rdfs: PREFIX owl: # get signature and stats of the class and property pattern SELECT ?subject_class ?property (GROUP_CONCAT(distinct ?object_type; separator=', ') as ?object_types) (GROUP_CONCAT(distinct ?property_type; separator=', ') as ?property_types) (count(?subject) as ?class_prop_occurences) (count(distinct ?subject) as ?subj_distinct_count) (count(distinct ?object) as ?obj_distinct_count) "~from_statement~" WHERE { VALUES (?subject_class ?property) {( skos:Concept skosxl:altLabel )} ?subject a ?subject_class; ?property ?object . OPTIONAL { ?object a ?object_class . } # binding the Object and property types BIND(datatype(?object) as ?data_type) BIND(IF(BOUND(?object_class),?object_class, IF (bound(?data_type), ?data_type, rdfs:Resource) ) as ?object_type) BIND(IF( isURI(?object) || isBlank( ?object ),owl:ObjectProperty , owl:DatatypeProperty) as ?property_type) } GROUP BY ?subject_class ?property " %} {% set content, error = from_endpoint(conf.default_endpoint).with_query(select_query).fetch_tabular() %} {% set caller_ = caller %} {% call renderers.render_fetch_results(content, error) %} {{ caller_(content) }} {% endcall %} {%- endmacro %}