From 3ab6ada31151476ddedd6932afb91f78ac3471bc Mon Sep 17 00:00:00 2001 From: Thomas Francart Date: Fri, 20 Oct 2023 10:28:10 +0200 Subject: [PATCH] Added links to download ontologies --- .gitignore | 2 + .../How-to-configure-Sparnatural.docx | Bin 4583544 -> 4583649 bytes .../How-to-configure-Sparnatural.md | 10933 ++++++++-------- .../How-to-configure-Sparnatural.pdf | Bin 7369370 -> 7370502 bytes 4 files changed, 5467 insertions(+), 5468 deletions(-) diff --git a/.gitignore b/.gitignore index bf81ae3b..5e4d5881 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ ontologies/graph_statistics.rq ontologies/widoco-1.4.14-jar-with-dependencies.jar ontologies/java-11-widoco-1.4.17-jar-with-dependencies.jar + +docs/how-to-configure/How-to-configure-Sparnatural.html diff --git a/docs/how-to-configure/How-to-configure-Sparnatural.docx b/docs/how-to-configure/How-to-configure-Sparnatural.docx index 1cff7bd010df55836b6cfc641b35bdb58047e24f..f2f93f88e7bf834e2b8386e6af96f3839fba6696 100644 GIT binary patch delta 44014 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 delta 43895 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 R5BYlz!a~Sf1_4jy{{YZ<=nwz^ diff --git a/docs/how-to-configure/How-to-configure-Sparnatural.md b/docs/how-to-configure/How-to-configure-Sparnatural.md index 9a5fcc2c..91973470 100644 --- a/docs/how-to-configure/How-to-configure-Sparnatural.md +++ b/docs/how-to-configure/How-to-configure-Sparnatural.md @@ -4,7 +4,7 @@ _You can also read the [**PDF version** of this guide](How-to-configure-Sparnatu _Make sure you have followed the "[Hello Sparnatural setup tutorial](../hello-sparnatural/Hello-Sparnatural.md)" before learning the configuration options._ -

How-to configure Sparnatural

 

date: 2023-09-12

Sparnatural version: 8.5.0


 

 

Introduction 3

Conventions 3

Prerequisites 3

Documentation files 3

Structure of the example ontology 4

Configuration spreadsheet 5

Protégé vs. spreadsheet 5

The Excel-2-RDF converter 5

If you use a Google spreadsheet 6

If you use a local spreadsheet 7

Filling-in the configuration spreadsheet 8

Adjusting the ontology URI and the prefixes 8

Ontology IRI 8

Metadata cleanup 9

Prefixes 9

Declaring classes 9

Declaring properties 11

Selecting property types (widgets) 14

Populating lists and autocomplete fields (datasources) 15

Using predefined datasources 15

Using predefined queries with your own properties 18

Declaring literal classes 19

How-to set some properties optional or negative 22

How-to map classes and properties to the underlying data model 25

General mechanism 25

Querying a sequence of properties (using a shortcut) 25

Querying inverse properties 27

Querying multiple properties in a single criteria 29

Querying a property recursively 30

Combining property paths 31

When the same property is used on multiple classes 31

Querying a subset of a class 32

Querying more than one class 33

Create a Multilingual configuration 33

Displaying labels in the result table 35

Default label properties 35

Multilingual default label properties 36

Advanced configuration 38

Advanced configuration : creating custom datasources 38

Advanced configuration : debugging custom datasources 40

Advanced configuration : setup tree widget datasource 42

 

 

 

Introduction

 

Welcome to this guide on how to configure Sparnatural !

 

The Sparnatural OWL configuration reference documentation lists the available annotations and axioms available to configure Sparnatural. In this documentation you will learn how to use these annotations concretely and define the classes, properties, widgets and datasources in order to make your Sparnatural explorer as appealing as possible for your users.

Conventions

 

URIs are indicated like this.

Headers in the spreadsheet are indicated like this.

 

How-to configure Sparnatural

 

date: 2023-10-20

Sparnatural version: 8.5.0


 

 

Introduction 3

Conventions 3

Prerequisites 3

Documentation files 3

Structure of the example ontology 4

Configuration spreadsheet 5

Protégé vs. spreadsheet 5

The Excel-2-RDF converter 5

If you use a Google spreadsheet 6

If you use a local spreadsheet 7

Filling-in the configuration spreadsheet 8

Adjusting the ontology URI and the prefixes 8

Ontology IRI 8

Metadata cleanup 9

Prefixes 9

Declaring classes 9

Declaring properties 11

Selecting property types (widgets) 14

Populating lists and autocomplete fields (datasources) 15

Using predefined datasources 15

Using predefined queries with your own properties 18

Declaring literal classes 19

How-to set some properties optional or negative 22

How-to map classes and properties to the underlying data model 25

General mechanism 25

Querying a sequence of properties (using a shortcut) 25

Querying inverse properties 27

Querying multiple properties in a single criteria 29

Querying a property recursively 30

Combining property paths 31

When the same property is used on multiple classes 31

Querying a subset of a class 32

Querying more than one class 33

Create a Multilingual configuration 33

Displaying labels in the result table 35

Default label properties 35

Multilingual default label properties 36

Advanced configuration 38

Advanced configuration : creating custom datasources 38

Advanced configuration : debugging custom datasources 40

Advanced configuration : setup tree widget datasource 42

 

 

 

Introduction

 

Welcome to this guide on how to configure Sparnatural !

 

The Sparnatural OWL configuration reference documentation lists the available annotations and axioms available to configure Sparnatural. In this documentation you will learn how to use these annotations concretely and define the classes, properties, widgets and datasources in order to make your Sparnatural explorer as appealing as possible for your users.

Conventions

 

URIs are indicated like this.

Headers in the spreadsheet are indicated like this.

 

Tip: this is a useful and practical tip.

Prerequisites

  1. Make sure you have followed the introductory “Hello Sparnatural” guide to setup your environment to point Sparnatural to your triplestore and adjust the browser security settings.

  2. You must have a local spreadsheet editor, like Microsoft Excel.

  3. You need to have a basic understanding of OWL ontologies.

  4. For configuring your own datasource queries, you need to be proficient with SPARQL. This is described in annex.

 

In addition, you can have the Protégé OWL editor installed, only if you want to browse the ontology in Protégé, but this is not a requirement.

 

Documentation files

 

This guide comes with a set of files that you should have ready:

  1. car.ttl : a sample OWL ontology describing car diagnostics.

  2. car_instances.ttl : a few manually crafted instances of the sample ontology. Although not strictly required, you should load these instances into your triplestore if you want to follow along and test the example configuration against the dataset.

  3. sparnatural-car-configuration.xlsx : the example Sparnatural Excel config file

  4. sparnatural-car-configuration.ttl : the result of converting the Excel config file with the Excel-2-RDF converter. This is the actual Sparnatural configuration file to pass in the “src” attribute of the sparnatural HTML element, if you want to test it to see the final result (but this is not required to follow this documentation).

 

Structure of the example ontology

 

For the purpose of this documentation we will use an example ontology, defined in car.ttl, and described in the following diagram:

Tip: this is a useful and practical tip.

Prerequisites

  1. Make sure you have followed the introductory “Hello Sparnatural” guide to setup your environment to point Sparnatural to your triplestore and adjust the browser security settings.

  2. You must have a local spreadsheet editor, like Microsoft Excel.

  3. You need to have a basic understanding of OWL ontologies.

  4. For configuring your own datasource queries, you need to be proficient with SPARQL. This is described in annex.

 

In addition, you can have the Protégé OWL editor installed, only if you want to browse the ontology in Protégé, but this is not a requirement.

 

Documentation files

 

This guide comes with a set of files that you should have ready. Click on the links to download them:

  1. car.ttl : a sample OWL ontology describing car diagnostics.

  2. car_instances.ttl : a few manually crafted instances of the sample ontology. Although not strictly required, you should load these instances into your triplestore if you want to follow along and test the example configuration against the dataset.

  3. sparnatural-car-configuration.xlsx : the example Sparnatural Excel config file

  4. sparnatural-car-configuration.ttl : the result of converting the Excel config file with the Excel-2-RDF converter. This is the actual Sparnatural configuration file to pass in the “src” attribute of the sparnatural HTML element, if you want to test it to see the final result (but this is not required to follow this documentation).

 

Structure of the example ontology

 

For the purpose of this documentation we will use an example ontology, defined in car.ttl, and described in the following diagram:

  • Click on Convert.

  • Save the resulting file in the same folder as your Sparnatural page.

  • Adjust the “src” attribute of the <spar-natural> HTML element to point to this local file.

  •  

    Reconvert the file the same way every time you make a change in it.

     

    Filling-in the configuration spreadsheet

     

    In this documentation we will work with a local spreadsheet. Download the spreadsheet configuration  template and save it in a local file. You will be working on this local file.

     

  • Click on Convert.

  • Save the resulting file in the same folder as your Sparnatural page.

  • Adjust the “src” attribute of the <spar-natural> HTML element to point to this local file.

  •  

    Reconvert the file the same way every time you make a change in it.

     

    Filling-in the configuration spreadsheet

     

    In this documentation we will work with a local spreadsheet. Download the spreadsheet configuration  template and save it in a local file. You will be working on this local file.

     

     

    Each column header corresponds to one configuration property as detailed in the Sparnatural OWL configuration reference documentation. The header line does not need to be at a fixed line; it is automagically detected, so don’t worry if you add or delete lines before this one.

     

     

     

    Adjusting the ontology URI and the prefixes

    You first need to adjust the URI of your ontology, as well as enter the prefixes used in your knowledge graph.

     

    Ontology IRI

    Make sure you are on the “classes” tab of the configuration template, and edit the content of cell B1. This cell needs to contain the URI of your configuration ontology. It is not very important, unless you plan to share your configuration later. It is typically set to something like “https://data.mydomain.com/sparnatural-config” or to a URL where Sparnatural will be deployed, like “https://mydomain.com/sparnatural-page/sparnatural-config”.

     

    Metadata cleanup

    Cells B2 and B3 are only useful when working with online Google spreadsheets, so that the configuration can be automated. We don’t need that in a local file, so simply delete the content of cells B2 and B3. Keep them if you work with a Google spreadsheet.

     

    Prefixes

    You need to add additional prefixes from your ontology. Some prefixes are already declared : “this”, “core” and “datasources”. Leave them as they are, and add prefixes in the same way in the lines below. The column A always needs to contain the keyword PREFIX, column B is the prefix name, and column C is the complete URI associated with the prefix.

    Don’t hesitate to add new lines if you need to add many prefixes.

     

    Example

     

    Following the above, in our example configuration we set the Ontology IRI to http://example.com/sparnatural-page/sparnatural-config, delete the content of cells B2 and B3, and add our prefix “odb” on line 10, corresponding to the URI http://example.com/ontology/odb# 

     

     

    Each column header corresponds to one configuration property as detailed in the Sparnatural OWL configuration reference documentation. The header line does not need to be at a fixed line; it is automagically detected, so don’t worry if you add or delete lines before this one.

     

     

     

    Adjusting the ontology URI and the prefixes

    You first need to adjust the URI of your ontology, as well as enter the prefixes used in your knowledge graph.

     

    Ontology IRI

    Make sure you are on the “classes” tab of the configuration template, and edit the content of cell B1. This cell needs to contain the URI of your configuration ontology. It is not very important, unless you plan to share your configuration later. It is typically set to something like “https://data.mydomain.com/sparnatural-config” or to a URL where Sparnatural will be deployed, like “https://mydomain.com/sparnatural-page/sparnatural-config”.

     

    Metadata cleanup

    Cells B2 and B3 are only useful when working with online Google spreadsheets, so that the configuration can be automated. We don’t need that in a local file, so simply delete the content of cells B2 and B3. Keep them if you work with a Google spreadsheet.

     

    Prefixes

    You need to add additional prefixes from your ontology. Some prefixes are already declared : “this”, “core” and “datasources”. Leave them as they are, and add prefixes in the same way in the lines below. The column A always needs to contain the keyword PREFIX, column B is the prefix name, and column C is the complete URI associated with the prefix.

    Don’t hesitate to add new lines if you need to add many prefixes.

     

    Example

     

    Following the above, in our example configuration we set the Ontology IRI to http://example.com/sparnatural-page/sparnatural-config, delete the content of cells B2 and B3, and add our prefix “odb” on line 10, corresponding to the URI http://example.com/ontology/odb# 

     

     

     

     

    Declaring classes

    Now you can start filling in the table with the classes of your ontology. Don’t hesitate to read the guidelines in the green line above the body of the table.

     

     

     

     

     

    Declaring classes

    Now you can start filling in the table with the classes of your ontology. Don’t hesitate to read the guidelines in the green line above the body of the table.

     

     

     

    The tooltip of the property is displayed if it was added before in the configuration file.

     

    We see a dropdown list appears when the range of the query (i.e. the “object” class of the assertion) is chosen. As explained before, the way the selected values are to be displayed depends on the type (rdfs:subPropertyOf) of the property, also referred to as the “widget” of the property.

     

     

     

    Selecting property types (widgets)

     

    For now Sparnatural offers the following ways of selecting a value for a criteria :

    Widget type (rdfs:subPropertyOf)

    Description

    core:ListProperty

    (or core:LiteralListProperty which is deprecated)

    dropdown list widget

    core:AutocompleteProperty

    autocomplete search field

    core:TreeProperty

    tree browsing widget, useful with some tree-shaped values, typically SKOS hierarchies, part-of hierarchies, etc;

    core:MapProperty

    map selection widget (GeoSPARQL queries)

    core:SearchProperty, core:StringEqualsProperty, core:GraphDBSearchProperty

    string search widget, searched as regex or as exact string

    core:TimeProperty-Date, core:TimeProperty-Year

    date range widget (date or year precision)

    core:BooleanProperty

    boolean widget (true/false, yes/no values…)

    core:NonSelectableProperty

    no value selection (useful for 'intermediate' entities whose values don’t need to be displayed)

     

     

    All of them are already fully documented in the reference documentation for Sparnatural widgets .

     

    The choice of the widget is driven by how we want the user to select a value, and how many different values are available (e.g. lists are good only when the values are relatively small, typically less than 500 distinct values).

     

    Example

    Note how the properties in our configuration uses different kinds of widgets:

     

     

    The tooltip of the property is displayed if it was added before in the configuration file.

     

    We see a dropdown list appears when the range of the query (i.e. the “object” class of the assertion) is chosen. As explained before, the way the selected values are to be displayed depends on the type (rdfs:subPropertyOf) of the property, also referred to as the “widget” of the property.

     

     

     

    Selecting property types (widgets)

     

    For now Sparnatural offers the following ways of selecting a value for a criteria :

    Widget type (rdfs:subPropertyOf)

    Description

    core:ListProperty

    (or core:LiteralListProperty which is deprecated)

    dropdown list widget

    core:AutocompleteProperty

    autocomplete search field

    core:TreeProperty

    tree browsing widget, useful with some tree-shaped values, typically SKOS hierarchies, part-of hierarchies, etc;

    core:MapProperty

    map selection widget (GeoSPARQL queries)

    core:SearchProperty, core:StringEqualsProperty, core:GraphDBSearchProperty

    string search widget, searched as regex or as exact string

    core:TimeProperty-Date, core:TimeProperty-Year

    date range widget (date or year precision)

    core:BooleanProperty

    boolean widget (true/false, yes/no values…)

    core:NonSelectableProperty

    no value selection (useful for 'intermediate' entities whose values don’t need to be displayed)

     

     

    All of them are already fully documented in the reference documentation for Sparnatural widgets .

     

    The choice of the widget is driven by how we want the user to select a value, and how many different values are available (e.g. lists are good only when the values are relatively small, typically less than 500 distinct values).

     

    Example

    Note how the properties in our configuration uses different kinds of widgets:

     

     

    On Manufacturer, we have set the odb:name property as core:NonSelectableProperty, because we assume the user will never have to search or select a value for the name of a Manufacturer.

    On Vehicle, the odb:VIN property is set as an autocomplete. Being a long technical identifier, having an autocomplete will help user selecting a correct value. The odb:manufacturer property uses a core:ListProperty because there is a limited list of possible car manufacturers, so using a list is convenient.

    On Diagnostic, odb:diagnosticDate uses a date property as the values in the graph have an xsd:date datatype.

     

     

     

    Populating lists and autocomplete fields (datasources)

     

    Using predefined datasources

     

    ListProperty and AutocompleteProperty require a datasource to be populated correctly. For that purpose use the datasources:datasource column of the Properties tab. The datasource of a dropdown list populates the list, the datasource of an autocomplete property feeds the autocomplete proposals. TreeProperty also requires two datasources; the configuration of tree datasources is covered in annex.

     

    In its most simple form, a datasource is a SPARQL query that will return some results.

     

    Sparnatural comes with off-the-shelves datasources, in tab “sparnatural-config-core” of the spreadsheet. Here you can find a list of preconfigured datasources corresponding to different widget types for lists, autocomplete (search) and tree.

     

     

    On Manufacturer, we have set the odb:name property as core:NonSelectableProperty, because we assume the user will never have to search or select a value for the name of a Manufacturer.

    On Vehicle, the odb:VIN property is set as an autocomplete. Being a long technical identifier, having an autocomplete will help user selecting a correct value. The odb:manufacturer property uses a core:ListProperty because there is a limited list of possible car manufacturers, so using a list is convenient.

    On Diagnostic, odb:diagnosticDate uses a date property as the values in the graph have an xsd:date datatype.

     

     

     

    Populating lists and autocomplete fields (datasources)

     

    Using predefined datasources

     

    ListProperty and AutocompleteProperty require a datasource to be populated correctly. For that purpose use the datasources:datasource column of the Properties tab. The datasource of a dropdown list populates the list, the datasource of an autocomplete property feeds the autocomplete proposals. TreeProperty also requires two datasources; the configuration of tree datasources is covered in annex.

     

    In its most simple form, a datasource is a SPARQL query that will return some results.

     

    Sparnatural comes with off-the-shelves datasources, in tab “sparnatural-config-core” of the spreadsheet. Here you can find a list of preconfigured datasources corresponding to different widget types for lists, autocomplete (search) and tree.

     

     

     

    Querying multiple properties in a single criteria

     

    This is to be used if you would like the user to query more than one property at the same time. This can be useful if you would like to provide a search field (core:SearchProperty) that will search in label + description. This can also be used if two classes are connected by more than one possible property and you want to search all of them, as “Person is friend with Person” and “Person is a colleague of Person”; you may want to provide your user with “Person knows Person”, and “knows” would search for both “is friend with” and “is colleague of”.

     

    You will do this with an “alternative path”, by joining all properties URI with the “|" character. In our example this would be “<http://example.com/is_friend_of>|<http://example.com/is_colleague_of>”. This means “follow either the is_friend_of or is_colleague_of properties”.

     

    Example

     

    To illustrate this on the Component class, we decided to query both label and component code in one unique field: you can see the new property this:labelOrCode has been created therefore with a special ”|” SPARQL string to combine both properties behind a single one :

     

     

     

    Querying multiple properties in a single criteria

     

    This is to be used if you would like the user to query more than one property at the same time. This can be useful if you would like to provide a search field (core:SearchProperty) that will search in label + description. This can also be used if two classes are connected by more than one possible property and you want to search all of them, as “Person is friend with Person” and “Person is a colleague of Person”; you may want to provide your user with “Person knows Person”, and “knows” would search for both “is friend with” and “is colleague of”.

     

    You will do this with an “alternative path”, by joining all properties URI with the “|" character. In our example this would be “<http://example.com/is_friend_of>|<http://example.com/is_colleague_of>”. This means “follow either the is_friend_of or is_colleague_of properties”.

     

    Example

     

    To illustrate this on the Component class, we decided to query both label and component code in one unique field: you can see the new property this:labelOrCode has been created therefore with a special ”|” SPARQL string to combine both properties behind a single one :

     

     

     

    We can see in the two following screenshot that a search for either a code or a label of component will work:

     

     

     

    Querying a property recursively

     

    This is to be used in combination with a tree property (core:TreeProperty). This is useful when you would like the user to query recursively and transparently into a complete “branch” of entities related with a hierarchical link (typically skos:broader or dcterms:isPartOf).

    Most of the time, when you provide a tree widget, the implicit expectation from the user is that when she selects a node in the tree, then the query would also search for all children of that node.

    For example if you have “Place is part of Place” in your graph, with places organized as a tree, if the user searches for “Restaurant located in Paris”, then she would expect to receive restaurants also located in places that are part of Paris, such as “17eme arrondissement”.

     

    You will do this with a combination of “sequence path” (the “/” operator seen above) and “zero or more path”, by appending a “*” symbol after the property URI. In our example this would be “<http://example.com/is_located_in>/<http://example.com/is_part_of>*”. This means: “follow the is_located_in property, then follow the is_part_of property recursively (until you reach the selected node, which in our example would be Paris)”; In other words “select all restaurants with a is_located_in property that points to a place that is linked to Paris with any number of is_part_of properties”.

     

    Combining property paths

     

    It is possible to combine the sequence operator (“/”), inverse operator (“^”), alternative operator (“|”), and zero-or-more operator (“*”). A typical use-case is to combine inverse with a sequence operator to traverse properties in the inverse direction in a sequence path.

     

    Example

     

    In our “Car” ontology we could imagine a direct link between a “Vehicle” and the “Error Code” that were diagnosed on this Vehicle, which would give the property path ^<http://example.com/ontology/odb#analysedVehicle>/<http://example.com/ontology/odb#hasResults>/<http://example.com/ontology/odb#hasErrorCode>

     

     

     

     

    When the same property is used on multiple classes

     

    It may happen that the same property is used on more than one class in the data model. A typical situation is when rdfs:label is used to label many entities in the data model. In that case, and in order to keep the configuration of each entity separated from the others, it is advised to create one specific line in the “this:” namespace for each entity, and map them to the same property in the core:sparqlString column. This way, each line can be configured differently and have different labels, tooltips or widget.

     

    For example if both foaf:Person and foaf:Organization can have the property foaf:name, you can declare this:personName with rdfs:domain foaf:Person, this:organizationName with rdfs:domain foaf:Organization, and map them both to <http://xmlns.com/foaf/0.1/name>

     

     

     

    Querying a property recursively

     

    This is to be used in combination with a tree property (core:TreeProperty). This is useful when you would like the user to query recursively and transparently into a complete “branch” of entities related with a hierarchical link (typically skos:broader or dcterms:isPartOf).

    Most of the time, when you provide a tree widget, the implicit expectation from the user is that when she selects a node in the tree, then the query would also search for all children of that node.

    For example if you have “Place is part of Place” in your graph, with places organized as a tree, if the user searches for “Restaurant located in Paris”, then she would expect to receive restaurants also located in places that are part of Paris, such as “17eme arrondissement”.

     

    You will do this with a combination of “sequence path” (the “/” operator seen above) and “zero or more path”, by appending a “*” symbol after the property URI. In our example this would be “<http://example.com/is_located_in>/<http://example.com/is_part_of>*”. This means: “follow the is_located_in property, then follow the is_part_of property recursively (until you reach the selected node, which in our example would be Paris)”; In other words “select all restaurants with a is_located_in property that points to a place that is linked to Paris with any number of is_part_of properties”.

     

    Combining property paths

     

    It is possible to combine the sequence operator (“/”), inverse operator (“^”), alternative operator (“|”), and zero-or-more operator (“*”). A typical use-case is to combine inverse with a sequence operator to traverse properties in the inverse direction in a sequence path.

     

    Example

     

    In our “Car” ontology we could imagine a direct link between a “Vehicle” and the “Error Code” that were diagnosed on this Vehicle, which would give the property path ^<http://example.com/ontology/odb#analysedVehicle>/<http://example.com/ontology/odb#hasResults>/<http://example.com/ontology/odb#hasErrorCode>

     

     

     

     

    When the same property is used on multiple classes

     

    It may happen that the same property is used on more than one class in the data model. A typical situation is when rdfs:label is used to label many entities in the data model. In that case, and in order to keep the configuration of each entity separated from the others, it is advised to create one specific line in the “this:” namespace for each entity, and map them to the same property in the core:sparqlString column. This way, each line can be configured differently and have different labels, tooltips or widget.

     

    For example if both foaf:Person and foaf:Organization can have the property foaf:name, you can declare this:personName with rdfs:domain foaf:Person, this:organizationName with rdfs:domain foaf:Organization, and map them both to <http://xmlns.com/foaf/0.1/name>

     

    Tip: It is even possible to *always* use the “this:” namespace when creating the properties in the configuration, and *always* map them to an underlying property using the core:sparqlString column. This has the advantage of not mixing your ontology namespace with the “this:” namespace in the configuration, but the disadvantage is that you need to always fill in the core:sparqlString column.

     

    Example

     

    In the Cars ontology, both Symptoms and Components can have rdfs:label. We chose to declare two separate lines “this:symptomLabel” and this:componentLabel, each mapped to <http://www.w3.org/2000/01/rdf-schema#label>. The label of the property (“label” in english, “a pour libellé” in French) remains the same, so it is identical from the user point of view; however tooltips can be different in each case, for example.

     

    Tip: It is even possible to *always* use the “this:” namespace when creating the properties in the configuration, and *always* map them to an underlying property using the core:sparqlString column. This has the advantage of not mixing your ontology namespace with the “this:” namespace in the configuration, but the disadvantage is that you need to always fill in the core:sparqlString column.

     

    Example

     

    In the Cars ontology, both Symptoms and Components can have rdfs:label. We chose to declare two separate lines “this:symptomLabel” and this:componentLabel, each mapped to <http://www.w3.org/2000/01/rdf-schema#label>. The label of the property (“label” in english, “a pour libellé” in French) remains the same, so it is identical from the user point of view; however tooltips can be different in each case, for example.

     

    Advanced note: Sparnatural is also configured with a “defaultLang” parameter. This default language is the language in which the knowledge graph is supposed to always have a label for all entities. This is meant to deal with situations where some entities do have a label in the user preferred language, and others don’t, but will have a label in the default language. The default label can be returned to display a label to the user.

     

     

    Example

     

    Classes and properties labels and tooltips can be translated in as many languages as wished just by adding the translations in an “@xx” column for each : here the classes tab, translated in French, rdfs:label@fr and core:tooltip@fr :

     

    Advanced note: Sparnatural is also configured with a “defaultLang” parameter. This default language is the language in which the knowledge graph is supposed to always have a label for all entities. This is meant to deal with situations where some entities do have a label in the user preferred language, and others don’t, but will have a label in the default language. The default label can be returned to display a label to the user.

     

     

    Example

     

    Classes and properties labels and tooltips can be translated in as many languages as wished just by adding the translations in an “@xx” column for each : here the classes tab, translated in French, rdfs:label@fr and core:tooltip@fr :

     

    Tip: sometimes the default label property for a class is available to the user as a property that can be searched on. For example Persons might have “name” as their default label property, and you want the user to search on person names with an autocomplete widget. But sometimes you want the default label property to be hidden in the query builder, and you simply need it to be fetched in the result table. In that case, proceed exactly as normal, except that you don’t set an rdfs:domain on the property used as the default label property. Leave the rdfs:domain column empty for that property. Properties without domain are still part of the configuration but hidden in the query builder.

     

    Example

     

    In this case we decided to display the Manufacturer’s names by using the odb:name property as a default label, the VIN number for the Vehicles (odb:VIN), the this:symptomLabel for Symptoms and the this:componentLabel for the Components. This is specified in the core:defaultLabelProperty column :

     

    Tip: sometimes the default label property for a class is available to the user as a property that can be searched on. For example Persons might have “name” as their default label property, and you want the user to search on person names with an autocomplete widget. But sometimes you want the default label property to be hidden in the query builder, and you simply need it to be fetched in the result table. In that case, proceed exactly as normal, except that you don’t set an rdfs:domain on the property used as the default label property. Leave the rdfs:domain column empty for that property. Properties without domain are still part of the configuration but hidden in the query builder.

     

    Example

     

    In this case we decided to display the Manufacturer’s names by using the odb:name property as a default label, the VIN number for the Vehicles (odb:VIN), the this:symptomLabel for Symptoms and the this:componentLabel for the Components. This is specified in the core:defaultLabelProperty column :

     

     

     

     

    Multilingual default label properties

     

    By default, when fetching the default label property, Sparnatural will not apply any language filter; so multiple values will be retrieved in case the label property holds multilingual values. In order to instruct Sparnatural to retrieve the default label property only in the current user language, set the core:isMultilingual column of that property to true.

     

    Example

     

    In the example data of the cars ontology, labels of components are multilingual, e.g. “Engine”@en and “Moteur”@fr. They are declared in the this:componentLabel configuration property. In order to indicate to Sparnatural that only the label in the current user language should be retrieved, we set “TRUE” in the core:isMultilingual column:

     

     

     

     

    Multilingual default label properties

     

    By default, when fetching the default label property, Sparnatural will not apply any language filter; so multiple values will be retrieved in case the label property holds multilingual values. In order to instruct Sparnatural to retrieve the default label property only in the current user language, set the core:isMultilingual column of that property to true.

     

    Example

     

    In the example data of the cars ontology, labels of components are multilingual, e.g. “Engine”@en and “Moteur”@fr. They are declared in the this:componentLabel configuration property. In order to indicate to Sparnatural that only the label in the current user language should be retrieved, we set “TRUE” in the core:isMultilingual column:

     

     

     

     

    Advanced configuration

    Advanced configuration : creating custom datasources

     

    Creating a custom datasource to populate a list property or an autocomplete property is possible by providing your custom SPARQL query. To do this you need to be proficient with SPARQL.

     

    To create your custom datasource, go to the “Datasources” tab of the configuration file, and:

     

    The datasources documentation explains the rules you need to follow to create your own SPARQL datasource. Please refer to this documentation for details. To sum it up, your query:

    • must return 2 variables ?uri and ?label

    • can take advantage of special variables that will be passed by Sparnatural before the query is sent, such as $domain with the class selected at the beginning of the criteria, $range with the class selected at the end, $property with the property selected, $lang with current user language, etc. You don’t *have to* use all of them.

     

    If you don’t see any results in your dropdown list populated with a custom query, refer to the next section to know how to debug the query.

     

    Example

     

    Here we propose to set a custom datasource for odb:hasComponent property. Let’s imagine it would be created using a concatenation of component code + component label. To do so we first write the SPARQL query that will be sent to the system to get the info, then we can embed it in a new “this” datasource (tab “Datasources” of Sparnatural config sheet) :

     

    The details of the SPARQL query is beyond the scope of this documentation, please simply note that a/ it is using “magic variables” $domain, $property, $lang that are replaced at runtime by Sparnatural with the corresponding values in the criteria being built (see the Sparnatural datasource documentation) and b/ note the BIND(CONCAT(...) AS ?label) line that is doing the actual concatenation of the code with the name, which is returned in the result set.

     

    Next step is modifying property’s datasource itself with the URI of the new datasource :

     

    The details of the SPARQL query is beyond the scope of this documentation, please simply note that a/ it is using “magic variables” $domain, $property, $lang that are replaced at runtime by Sparnatural with the corresponding values in the criteria being built (see the Sparnatural datasource documentation) and b/ note the BIND(CONCAT(...) AS ?label) line that is doing the actual concatenation of the code with the name, which is returned in the result set.

     

    Next step is modifying property’s datasource itself with the URI of the new datasource :

     

     

    Then testing the query in the query builder to check that the query works well :

     

     

    Then testing the query in the query builder to check that the query works well :

     

    Warning : remember that this is the final query being sent, after all “magic variables” have been replaced by Sparnatural with their final values. Please refer to the datasource documentation for explanations on these variables. When you understand why the query does not work, remember to replace all fixed variables back with their magic variable name (e.g. $domain, $lang, etc.)

     

    Advanced configuration : setup tree widget datasource

     

    A tree widget requires two datasources : one to get the roots of the tree, and one to get the children of a node that is unfolded. This is set with the datasources:treeRootsDatasource

    and datasources:treeChildrenDatasource columns respectively, in the “Properties” tab. These two columns are useful only when the property is a core:TreeProperty, you can ignore them otherwise. The datasource documentation gives the details of the existing default tree datasources and how to create a new tree widget datasource. Please refer to this documentation for details.

     

    Example

     

    In Sparnatural car configuration, the class odb:ErrorCode has a property odb:hasComponent, which refer to car components that re structured in a hierarchized manner. Therefore we can set this property as a core:TreeProperty with two custom tree datasources, one identified with this:tree_root_Component and one identified with this:tree_children_Component, which serve respectively to fetch the roots and the children of a node.

    Warning : remember that this is the final query being sent, after all “magic variables” have been replaced by Sparnatural with their final values. Please refer to the datasource documentation for explanations on these variables. When you understand why the query does not work, remember to replace all fixed variables back with their magic variable name (e.g. $domain, $lang, etc.)

     

    Advanced configuration : setup tree widget datasource

     

    A tree widget requires two datasources : one to get the roots of the tree, and one to get the children of a node that is unfolded. This is set with the datasources:treeRootsDatasource

    and datasources:treeChildrenDatasource columns respectively, in the “Properties” tab. These two columns are useful only when the property is a core:TreeProperty, you can ignore them otherwise. The datasource documentation gives the details of the existing default tree datasources and how to create a new tree widget datasource. Please refer to this documentation for details.

     

    Example

     

    In Sparnatural car configuration, the class odb:ErrorCode has a property odb:hasComponent, which refer to car components that re structured in a hierarchized manner. Therefore we can set this property as a core:TreeProperty with two custom tree datasources, one identified with this:tree_root_Component and one identified with this:tree_children_Component, which serve respectively to fetch the roots and the children of a node.