The Virtuoso Sponger is a middleware component of Virtuoso that generates RDF Linked Data from a variety of data sources. The sponger is transparently integrated into the Virtuoso SPARQL Query Processor, where it serves as part of the URI/IRI dereferencing functionality. It is also optionally used by the Virtuoso Content Crawler.
![]() |
Figure: 14.6.1.1.1. Virtuoso Sponger |
A majority of the worlds data naturally resides in non RDF form at the current time. The Sponger delivers middleware that accelerates the bootstrap of the Semantic Data Web by generating RDF from non RDF data sources, unobtrusively.
When an RDF aware client requests data from a network accessible resource via the Sponger the following events occur:
The imported data forms a local cache and its invalidation rules conform to those of traditional HTTP clients (Web Browsers). Thus, expiration time is determined based on subsequent data fetches of the same resource (note: the first data load will record the 'expires' header) with current time compared to expiration time stored in the local cache. If HTTP 'expires' header data isn't returned by the source data server, then the "Sponger" will derive it's own invalidation time frame by evaluating the 'date' header and 'last-modified' HTTP headers. Irrespective of path taken, local cache invalidation is driven by an assessment of current time relative to recorded expiration time.
Designed with a pluggable architecture, the Sponger's core functionality is provided by Cartridges. Each cartridge includes Data Extractors which extract data from one or more data sources, and Ontology Mappers which map the extracted data to one or more ontologies/schemas, and route to producing RDF Linked Data.
The Schema Mappers are typically XSLT (e.g. GRDDL and other OpenLink Mapping Schemes) or Virtuoso PL based. The Metadata Extractors may be developed in Virtuoso PL, C/C++, Java, or any other language that can be integrated into the Virtuoso via it's server extensions APIs.
The Sponger also includes a pluggable name resolution mechanism that enables the development of Custom Resolvers for naming schemes (e.g. URNs) associated with protocols beyond HTTP. Examples of custom resolvers include:
The Sponger is comprised of cartridges which are themselves comprised of an entity extractor and an ontology mapper. Entities extracted from non-RDF resources are used as the basis for generating structured data by mapping them to a suitable ontology. A cartridge is invoked through its cartridge hook, a Virtuoso/PL procedure entry point and binding to the cartridge's entity extractor and ontology mapper.
These Cartridges handle open formats: typically community-developed, openly-documented, and freely-licensed data structures.
These Cartridges handle closed formats: typically proprietary, sometimes undocumented, possibly licensed to no-one except the format originator. Sometimes data may not be parsed as desired or expected, as many of these Cartridges have required reverse-engineering of the data format in question.
These Cartridges submit the Resource identified by the URI to third-party Web Services for processing. Returned RDF supplements the RDF generated by other Cartridges, such as those in the preceding tables. Locally generated RDF may also be submitted to the third-party services, instead of or in addition to the original Resource itself.
Cartridge | Sample URI | Resource Description | Linked Data Graph |
---|---|---|---|
BBC | example | HTML Representation | Data Explorer View |
CNET | example | HTML Representation | Data Explorer View |
DBpedia | example | HTML Representation | Data Explorer View |
eBay | example | HTML Representation | Data Explorer View |
FriendFeed | example | HTML Representation | Data Explorer View |
Get Glue | example | HTML Representation | Data Explorer View |
LOD | example | HTML Representation | Data Explorer View |
New York Times | example | HTML Representation | Data Explorer View |
OpenCalais | example | HTML Representation | Data Explorer View |
Technorati | example | HTML Representation | Data Explorer View |
Twine | example | HTML Representation | Data Explorer View |
example | HTML Representation | Data Explorer View | |
World Bank | example | HTML Representation | Data Explorer View |
Zemanta | example | HTML Representation | Data Explorer View |
Basic
Sponger cartridges are invoked as follows:
When the SPARQL processor dereferences a URI, it plays the role of an HTTP user agent (client) that makes a content type specific request to an HTTP server via the HTTP request's Accept headers. The following then occurs:
Meta
Virtuoso also supports another cartridge type - a 'meta-cartridge'. Meta-cartridges act as post-processors in the cartridge pipeline, augmenting entity descriptions in an RDF graph with additional information gleaned from 'lookup' data sources and web services.
The "Sponger" is an example of a new class of tools for converting non-RDF data into RDF. Such tools are known as RDFizers. Introduced in Virtuoso Universal Server 5.0, the Sponger is packaged in an easily extensible framework, with tight integration to the Virtuoso RDF Quad Store.
The Sponger provides built-in RDF middleware for transforming non-RDF data into RDF "on the fly". Its goal is to use non-RDF Web data sources as input, e.g. (X)HTML Web Pages, (X)HTML Web pages hosting microformats, and even Web services such as those from Google, Del.icio.us, Flickr etc., and create RDF as output. The implication of this facility is that you can use non-RDF data sources as Semantic Web data sources.
How is it used?
The Sponger can be invoked via the following mechanisms:
File metadata extraction by ODS-Briefcase details you can find at the Virtuoso Sponger whitepaper.
SPARQL Query Processor IRI Dereferencing
The Sponger is transparently integrated into the Virtuoso SPARQL query processor, where it supports IRI dereferencing.
Given the distributed nature of RDF data, it is quite possible when executing a SPARQL query that some of the referenced data resides outside the local quad store. To cope with this scenario, the Virtuoso SPARQL query processor can be instructed to retrieve the external data and cache it in local quad storage. This feature is exposed through a set of Virtuoso SPARQL extensions known as "IRI dereferencing". Essentially these enable downloading and local storage of selected triples either from one or more named graphs or based on a proximity search from a starting URI for entities matching the select criteria and also related by the specified predicates, up to a given depth. Because the SPARQL processor understands only RDF data (serialized as RDF/XML, Turtle, N3), it utilizes the Sponger RDF mapper functionality when dereferencing web or file resources which don't naturally contain RDF data.
RDF Proxy Service
The Sponger's functionality is also exposed via an in-built REST style Web service. This web service takes a target URL and either returns the content "as is" or tries to transform (by sponging) to RDF. Thus, the proxy service can be used as a 'pipe' for RDF browsers to browse non-RDF sources.
When the rdf_mappers package is installed, Virtuoso reserves the path '/about/[id|data|rdf|html]/http/' for Sponger Proxy URI Service. For example, if a Virtuoso installation on host example.com listens for HTTP requests on port 8080 then client applications should use a 'service endpoint' string equal to 'http://example.com:8080/about/[id|data|rdf|html]/http/'. If the rdf_mappers package is not installed, then the service uses the path '/proxy/rdf/'.
Note: The old Sponger Proxy URI Service pattern '/proxy/' is now deprecated.
Example:
The following URLs return information about musician John Cale, gleaned from the MusicBrainz music metadatabase, rendered as RDF or HTML respectively. (The sponged data is available in the HTML rendering through the foaf:primaryTopic property.)
The Sponger forms part of the extensible RDF framework built into Virtuoso Universal Server. A key component of the Sponger's pluggable architecture is its support for Sponger Cartridges, which themselves are comprised of an Entity Extractor and an Ontology Mapper. Virtuoso bundles numerous pre-written cartridges for RDF data extraction from a wide range of data sources. However, developers are free to develop their own custom cartridges. This programmer's guide describes how.
The guide is a companion to the Virtuoso Sponger whitepaper. The latter describes the Sponger in depth, its architecture, configuration, use and integration with other Virtuoso facilities such as the Open Data Services (ODS) application framework. This guide focuses solely on custom cartridge development.
For configuring CURIEs used by the Sponger which is exposed via sponger clients such as "description.vsp" - the VSP based information resource description utility, you can use the xml_set_ns_decl function.
Here is sample example to add curie pattern:
-- Example link: http://linkeddata.uriburner.com/about/rdf/http://twitter.com/guykawasaki/status/1144945513#this XML_SET_NS_DECL ('uriburner', 'http://linkeddata.uriburner.com/about/rdf/http://', 2);
The Sponger is comprised of cartridges which are themselves comprised of an entity extractor and an ontology mapper. Entities extracted from non-RDF resources are used as the basis for generating structured data by mapping them to a suitable ontology. A cartridge is invoked through its cartridge hook, a Virtuoso/PL procedure entry point and binding to the cartridge's entity extractor and ontology mapper.
Entity Extractor
When an RDF aware client requests data from a network accessible resource via the Sponger the following events occur:
Extraction Pipeline
Depending on the file or format type detected at ingest, the Sponger applies the appropriate entity extractor. Detection occurs at the time of content negotiation instigated by the retrieval user agent. The normal extraction pipeline processing is as follows:
Ontology Mapper
Sponger ontology mappers peform the the task of generating RDF instance data from extracted entities (non-RDF) using ontologies associated with a given data source type. They are typically XSLT (using GRDDL or an in-built Virtuoso mapping scheme) or Virtuoso/PL based. Virtuoso comes preconfigured with a large range of ontology mappers contained in one or more Sponger cartridges.
Cartridge Registry
To be recognized by the SPARQL engine, a Sponger cartridge must be registered in the Cartridge Registry by adding a record to the table DB.DBA.SYS_RDF_MAPPERS, either manually via DML, or more easily through Conductor, Virtuoso's browser-based administration console, which provides a UI for adding your own cartridges. (Sponger configuration using Conductor is described in detail later.) The SYS_RDF_MAPPERS table definition is as follows:
create table "DB"."DBA"."SYS_RDF_MAPPERS" ( "RM_ID" INTEGER IDENTITY, -- cartridge ID. Determines the order of the cartridge's invocation in the Sponger processing chain "RM_PATTERN" VARCHAR, -- a REGEX pattern to match the resource URL or MIME type "RM_TYPE" VARCHAR, -- which property of the current resource to match: "MIME" or "URL" "RM_HOOK" VARCHAR, -- fully qualified Virtuoso/PL function name "RM_KEY" LONG VARCHAR, -- API specific key to use "RM_DESCRIPTION" LONG VARCHAR, -- cartridge description (free text) "RM_ENABLED" INTEGER, -- a 0 or 1 integer flag to exclude or include the cartridge from the Sponger processing chain "RM_OPTIONS" ANY, -- cartridge specific options "RM_PID" INTEGER IDENTITY, PRIMARY KEY ("RM_PATTERN", "RM_TYPE") );
The Virtuoso SPARQL processor supports IRI dereferencing via the Sponger. If a SPARQL query references non-default graph URIs, the Sponger goes out (via HTTP) to sponge the data source URIs and inserts the extracted RDF data into the local RDF quad store. The Sponger invokes the appropriate cartridge for the data source type to produce RDF instance data. If none of the registered cartridges are capable of handling the received content type, the Sponger will attempt to obtain RDF instance data via the in-built WebDAV metadata extractor.
Sponger cartridges are invoked as follows:
When the SPARQL processor dereferences a URI, it plays the role of an HTTP user agent (client) that makes a content type specific request to an HTTP server via the HTTP request's Accept headers. The following then occurs:
Meta-Cartridges
The above describes the RDF generation process for 'primary' Sponger cartridges. Virtuoso also supports another cartridge type - a 'meta-cartridge'. Meta-cartridges act as post-processors in the cartridge pipeline, augmenting entity descriptions in an RDF graph with additional information gleaned from 'lookup' data sources and web services. Meta-cartridges are described in more detail in a later section.
![]() |
Figure: 14.6.1.3.3.1. Meta-Cartridges |
Virtuoso supplies a number of prewritten cartridges for extracting RDF data from a variety of popular Web resources and file types. The cartridges are bundled as part of the rdf_mappers VAD (Virtuoso Application Distribution). Appendix B of the Virtuoso Sponger whitepaper briefly outlines the cartridges contained in the VAD.
To see which cartridges are available, look at the 'RDF Cartridges' screen in Conductor. This can be reached through the 'RDF' > 'RDF Cartridges' tabbed menu items.
![]() |
Figure: 14.6.1.3.4.1. RDF Cartridges |
To check which version of the rdf_mappers VAD is installed, or to upgrade it, refer to Conductor's 'VAD Packages' screen, reachable through the 'System Admin' > 'Packages' menu items.
The latest VADs for the closed source releases of Virtuoso can be downloaded from the downloads area on the OpenLink website. Select either the 'DBMS (WebDAV) Hosted' or 'File System Hosted' product format from the 'Distributed Collaborative Applications' section, depending on whether you want the Virtuoso application to use WebDAV or native filesystem storage. VADs for Virtuoso Open Source edition (VOS) are available for download from the VOS Wiki.
For developers wanting example cartridge code, the most authoritative reference is the rdf_mappers VAD source code itself. This is included as part of the VOS distribution. After downloading and unpacking the sources, the script used to create the cartridges, and the associated stylesheets can be found in:
Alternatively, you can look at the actual cartridge implementations installed in your Virtuoso instance by inspecting the cartridge hook function used by a particular cartridge. This is easily identified from the 'Cartridge name' field of Conductor's 'RDF Cartridges' screen, after selecting the cartridge of interest. The hook function code can be viewed from the 'Schema Objects' screen under the 'Database' menu, by locating the function in the 'DB' > 'Procedures' folder. Stylesheets used by the cartridges are installed in the WebDAV folder DAV/VAD/rdf_mappers/xslt. This can be explored using Conductor's WebDAV interface. The actual rdf_mappers.sql file installed with your system can also be found in the DAV/VAD/rdf_mappers folder.
Virtuoso comes well supplied with a variety of Sponger cartridges and GRDDL filters. When then is it necessary to write your own cartridge?
In the main, writing a new cartridge should only be necessary to generate RDF from a REST-style Web service not supported by an existing cartridge, or to customize the output from an existing cartridge to your own requirements. Apart from these circumstances, the existing Sponger infrastructure should meet most of your needs. This is particularly the case for document resources.
We use the term document resource to identify content which is not being returned from a Web service. Normally it can broadly be conceived as some form of document, be it a text based entity or some form of file, for instance an image file.
In these cases, the document either contains RDF, which can be extracted directly, or it holds metadata in a supported format which can be transformed to RDF using an existing filter.
The following cases should all be covered by the existing Sponger cartridges:
GRDDL (Gleaning Resource Descriptions from Dialects of Languages) is mechanism for deriving RDF data from XML documents and in particular XHTML pages. Document authors may associate transformation algorithms, typically expressed in XSLT, with their documents to transform embedded metadata into RDF.
The rdf_mappers VAD installs a number of GRDDL filters for transforming popular microformats (such as RDFa, eRDF or hCalendar) into RDF. The available filters can be viewed, or configured, in Conductor's 'GRDDL Filters for XHTML' screen. Navigate to the 'RDF Cartridges' screen using the 'RDF' > 'RDF Cartridges' menu items, then SELECT the 'GRDDL Mappings' tab to display the 'GRDDL Filters for XHTML' screen. GRDDL filters are held in the WebDAV folder /DAV/VAD/rdf_cartridges/xslt/ alongside other XSLT templates. The Conductor interface allows you to add new GRDDL filters should you so wish.
For an introduction to GRDDL, try the GRDDL Primer. To underline GRDDL's utility, the primer includes an example of transforming Excel spreadsheet data, saved as XML, into RDF.
A comprehensive list of stylesheets for transforming HTML and non-HTML XML dialects is maintained on the ESW Wiki. The list covers a range of microformats, syndication formats and feedlists.
To see which Web Services are already catered for, view the list of cartridges in Conductor's 'RDF Cartridges' screen.
The Sponger is fully extensible by virtue of its pluggable cartridge architecture. New data formats can be sponged by creating new cartridges. While OpenLink is active in adding cartridges for new data sources, you are free to develop your own custom cartridges. Entity extractors can be built using Virtuoso PL, C/C++, Java or any other external language supported by Virtuoso's Server Extension API. Of course, Virtuoso's own entity extractors are written in Virtuoso PL.
Cartridge Hook Function
Every Virtuoso PL hook function used to plug a custom Sponger cartridge into the Virtuoso SPARQL engine must have a parameter list with the following parameters (the names of the parameters are not important, but their order and presence are):
Return Value
If the hook procedure returns zero the next cartridge will be tried. If the result is negative the sponging process stops, instructing the SPARQL engine that nothing was retrieved. If the result is positive the process stops, this time instructing the SPARQL engine that RDF data was successfully retrieved.
If your cartridge should need to test whether other cartridges are configured to handle a particular data source, the following extract taken from the RDF_LOAD_CALAIS hook procedure illustrates how you might do this:
if (xd is not null) { -- Sponging successful. Load sponged data in Virtuoso quad store DB.DBA.RM_RDF_LOAD_RDFXML (xd, new_origin_uri, coalesce (dest, graph_iri)); flag := 1; } declare ord any; ord := (SELECT RM_ID FROM DB.DBA.SYS_RDF_MAPPERS WHERE RM_HOOK = 'DB.DBA.RDF_LOAD_CALAIS'); for SELECT RM_PATTERN FROM DB.DBA.SYS_RDF_MAPPERS WHERE RM_ID > ord and RM_TYPE = 'URL' and RM_ENABLED = 1 ORDER BY RM_ID do { if (regexp_match (RM_PATTERN, new_origin_uri) is not null) -- try next candidate cartridge flag := 0; } return flag;
Specifying the Target Graph
Two cartridge hook function parameters contain graph IRIs, graph_iri and dest. graph_iri identifies an input graph being crawled. dest holds the IRI specified in any input:grab-destination pragma defined to control the SPARQL processor's IRI dereferencing. The pragma overrides the default behaviour and forces all retrieved triples to be stored in a single graph, irrespective of their graph of origin.
So, under some circumstances depending on how the Sponger has been invoked and whether it is being used to crawl an existing RDF graph, or derive RDF data from a non-RDF data source, dest may be null.
Consequently, when loading sponged RDF data into the quad store, cartridges typically specify the graph to receive the data using the coalesce function which returns the first non-null parameter. e.g.
DB.DBA.RDF_LOAD_RDFXML (xd, new_origin_uri, coalesce (dest, graph_iri));
Here xd is an RDF/XML string holding the sponged RDF.
Specifying & Retrieving Cartridge Specific Options
The hook function prototype allows cartridge specific data to be passed to a cartridge through the RM_OPTIONS parameter, a Virtuoso/PL vector which acts as a heterogeneous array.
In the following example, two options are passed, 'add-html-meta' and 'get-feeds' with both values set to 'no'.
insert soft DB.DBA.SYS_RDF_MAPPERS ( RM_PATTERN, RM_TYPE, RM_HOOK, RM_KEY, RM_DESCRIPTION, RM_OPTIONS ) values ( '(text/html)|(text/xml)|(application/xml)|(application/rdf.xml)', 'MIME', 'DB.DBA.RDF_LOAD_HTML_RESPONSE', null, 'xHTML', vector ('add-html-meta', 'no', 'get-feeds', 'no') );
The RM_OPTIONS vector can be handled as an array of key-value pairs using the get_keyword function. get_keyword performs a case sensitive search for the given keyword at every even index of the given array. It returns the element following the keyword, i.e. the keyword value.
Using get_keyword, any options passed to the cartridge can be retrieved using an approach similar to that below:
create procedure DB.DBA.RDF_LOAD_HTML_RESPONSE ( in graph_iri varchar, in new_origin_uri varchar, in dest varchar, inout ret_body any, inout aq any, inout ps any, inout _key any, inout opts any ) { declare get_feeds, add_html_meta; ... get_feeds := add_html_meta := 0; if (isarray (opts) and 0 = mod (length(opts), 2)) { if (get_keyword ('get-feeds', opts) = 'yes') get_feeds := 1; if (get_keyword ('add-html-meta', opts) = 'yes') add_html_meta := 1; } ...
API Keys
Certain web services require applications to provide an API key to use the service. Flickr is one such service. Developers must register to obtain a key. See for instance http://developer.yahoo.com/flickr/. In order to cater for services which require an application key, the Cartridge Registry SYS_RDF_MAPPERS table includes an RM_KEY column to store any key required for a particular service. This value is passed to the service's cartridge through the _key parameter of the cartridge hook function.
Alternatively a cartridge can store a key value in the virtuoso.ini configuration file and retrieve it in the hook function.
The next example shows an extract from the Flickr cartridge hook function DB.DBA.RDF_LOAD_FLICKR_IMG and the use of an API key. Also, commented out, is a call to cfg_item_value() which illustrates how the API key could instead be stored and retrieved from the SPARQL section of the virtuoso.ini file.
create procedure DB.DBA.RDF_LOAD_FLICKR_IMG ( in graph_iri varchar, in new_origin_uri varchar, in dest varchar, inout _ret_body any, inout aq any, inout ps any, inout _key any, inout opts any ) { declare xd, xt, url, tmp, api_key, img_id, hdr, exif any; declare exit handler for sqlstate '*' { return 0; }; tmp := sprintf_inverse (new_origin_uri, 'http://farm%s.static.flickr.com/%s/%s_%s.%s', 0); img_id := tmp[2]; api_key := _key; --cfg_item_value (virtuoso_ini_path (), 'SPARQL', 'FlickrAPIkey'); if (tmp is null or length (tmp) <> 5 or not isstring (api_key)) return 0; url := sprintf('http://api.flickr.com/services/rest/?method=flickr.photos.getInfo&photo_id=%s&api_key=%s',img_id, api_key); tmp := http_get (url, hdr);
XSLT - The Fulchrum
XSLT is the fulchrum of all OpenLink supplied cartridges. It provides the most convenient means of converting structured data extracted from web content by a cartridge's Entity Extractor into RDF.
Virtuoso's XML Infrastructure & Tools
Virtuoso's XML support and XSLT support are covered in detail in the on-line documentation. Virtuoso includes a highly capable XML parser and supports XPath, XQuery, XSLT and XML Schema validation.
Virtuoso supports extraction of XML documents from SQL datasets. A SQL long varchar, long xml or xmltype column in a database table can contain XML data as text or in a binary serialized format. A string representing a well-formed XML entity can be converted into an entity object representing the root node.
While Sponger cartridges will not normally concern themselves with handling XML extracted from SQL data, the ability to convert a string into an in-memory XML document is used extensively. The function xtree_doc(string) converts a string into such a document and returns a reference to the document's root. This document together with an appropriate stylesheet forms the input for the transformation of the extracted entities to RDF using XSLT. The input string to xtree_doc generally contains structured content derived from a web service.
Virtuoso XSLT Support
Virtuoso implements XSLT 1.0 transformations as SQL callable functions. The xslt() Virtuoso/PL function applies a given stylesheet to a given source XML document and returns the transformed document. Virtuoso provides a way to extend the abilities of the XSLT processor by creating user defined XPath functions. The functions xpf_extension() and xpf_extension_remove() allow addition and removal of XPath extension functions.
General Cartridge Pipeline
The broad pipeline outlined here reflects the steps common to most cartridges:
The MusicBrainz cartridge typifies this approach. MusicBrainz is a community music metadatabase which captures information about artists, their recorded works, and the relationships between them. Artists always have a unique ID, so the URL http://musicbrainz.org/artist/4d5447d7-c61c-4120-ba1b-d7f471d385b9.html takes you directly to entries for John Lennon.
If you were to look at this page in your browser, you would see that the information about the artist contains no RDF data. However, the cartridge is configured to intercept requests to URLs of the form http://musicbrainz.org/([^/]*)/([^.]*) and redirect to the cartridge to sponge all the available information on the given artist, release, track or label.
The cartridge extracts entities by redirecting to the MusicBrainz XML Web Service using as the basis for the initial query the item ID, e.g. an artist or label ID, extracted from the original URL. Stripped to its essentials, the core of the cartridge is:
webservice_uri := sprintf ('http://musicbrainz.org/ws/1/%s/%s?type=xml&inc=%U', kind, id, inc); content := RDF_HTTP_URL_GET (webservice_uri, '', hdr, 'GET', 'Accept: */*'); xt := xtree_doc (content); ... xd := DB.DBA.RDF_MAPPER_XSLT (registry_get ('_rdf_mappers_path_') || 'xslt/mbz2rdf.xsl', xt); ... xd := serialize_to_UTF8_xml (xd); DB.DBA.RM_RDF_LOAD_RDFXML (xd, new_origin_uri, coalesce (dest, graph_iri));
In the above outline, RDF_HTTP_URL_GET sends a query to the MusicBrainz web service, using query parameters appropriate for the original request, and retrieves the response using HTTP GET.
The returned XML is parsed into an in-memory parse tree by xtree_doc. Virtuoso/PL function RDF_MAPPER_XSLT is a simple wrapper around the function xslt which sets the current user to dba before returning an XML document transformed by an XSLT stylesheet, in this case mbz2rdf.xsl. Function serialize_to_UTF8_xml changes the character set of the in-memory XML document to UTF8. Finally, RM_RDF_LOAD_RDFXML is a wrapper around RDF_LOAD_RDFXML which parses the content of an RDF/XML string into a sequence of RDF triples and loads them into the quad store. XSLT stylesheets are usually held in the DAV/VAD/rdf_mappers/xslt folder of Virtuoso's WebDAV store. registry_get('rdf_mappers_path') returns the RDF Mappers VAD path, 'DAV/VAD/rdf_mappers', from the Virtuoso registry.
Error Handling with Exit Handlers
Virtuoso condition handlers determine the behaviour of a Virtuoso/PL procedure when a condition occurs. You can declare one or more condition handlers in a Virtuoso/PL procedure for general SQL conditions or specific SQLSTATE values. If a statement in your procedure raises an SQLEXCEPTION condition and you declared a handler for the specific SQLSTATE or SQLEXCEPTION condition the server passes control to that handler. If a statement in your Virtuoso/PL procedure raises an SQLEXCEPTION condition, and you have not declared a handler for the specific SQLSTATE or the SQLEXCEPTION condition, the server passes the exception to the calling procedure (if any). If the procedure call is at the top-level, then the exception is signaled to the calling client.
A number of different condition handler types can be declared (see the Virtuoso reference documentation for more details.) Of these, exit handlers are probably all you will need. An example is shown below which handles any SQLSTATE. Commented out is a debug statement which outputs the message describing the SQLSTATE.
create procedure DB.DBA.RDF_LOAD_SOCIALGRAPH (in graph_iri varchar, ...) { declare qr, path, hdr any; ... declare exit handler for sqlstate '*' { -- dbg_printf ('%s', __SQL_MESSAGE); return 0; }; ... -- data extraction and mapping successful return 1; }
Exit handlers are used extensively in the Virtuoso supplied cartridges. They are useful for ensuring graceful failure when trying to convert content which may not conform to your expectations. The RDF_LOAD_FEED_SIOC procedure (which is used internally by several cartridges) shown below uses this approach:
-- /* convert the feed in rss 1.0 format to sioc */ create procedure DB.DBA.RDF_LOAD_FEED_SIOC (in content any, in iri varchar, in graph_iri varchar, in is_disc int := '') { declare xt, xd any; declare exit handler for sqlstate '*' { goto no_sioc; }; xt := xtree_doc (content); xd := DB.DBA.RDF_MAPPER_XSLT ( registry_get ('_rdf_mappers_path_') || 'xslt/feed2sioc.xsl', xt, vector ('base', graph_iri, 'isDiscussion', is_disc)); xd := serialize_to_UTF8_xml (xd); DB.DBA.RM_RDF_LOAD_RDFXML (xd, iri, graph_iri); return 1; no_sioc: return 0; }
Loading RDF into the Quad Store
RDF_LOAD_RDFXML & TTLP
The two main Virtuoso/PL functions used by the cartridges for loading RDF data into the Virtuoso quad store are DB.DBA.TTLP and DB.DBA.RDF_LOAD_RDFXML. Multithreaded versions of these functions, DB.DBA.TTLP_MT and DB.DBA.RDF_LOAD_RDFXML_MT, are also available.
RDF_LOAD_RDFXML parses the content of an RDF/XML string as a sequence of RDF triples and loads then into the quad store. TTLP parses TTL (Turtle or N3) and places its triples into quad storage. Ordinarily, cartridges use RDF_LOAD_RDFXML. However there may be occasions where you want to insert statements written as TTL, rather than RDF/XML, in which case you should use TTLP.
Attribution
Many of the OpenLink supplied cartridges actually use RM_RDF_LOAD_RDFXML to load data into the quad store. This is a thin wrapper around RDF_LOAD_RDFXML which includes in the generated graph an indication of the external ontologies being used. The attribution takes the form:
<ontologyURI> a opl:DataSource . <spongedResourceURI> rdfs:isDefinedBy <ontologyURI> . <ontologyURI> opl:hasNamespacePrefix "<ontologyPrefix>" .
where prefix opl: denotes the ontology http://www.openlinksw.com/schema/attribution#.
Deleting Existing Graphs
Before loading sponged RDF data into a graph, you may want to delete any existing graph with the same URI. To do so, select the 'RDF' > 'List of Graphs' menu commands in Conductor, then use the 'Delete' command for the appropriate graph. Alternatively, you can use one of the following SQL commands:
SPARQL CLEAR GRAPH -- or DELETE FROM DB.DBA.RDF_QUAD WHERE G = DB.DBA.RDF_MAKE_IID_OF_QNAME (graph_iri)
Proxy Service Data Expiration
When the Proxy Service is invoked by a user agent, the Sponger records the expiry date of the imported data in the table DB.DBA.SYS_HTTP_SPONGE. The data invalidation rules conform to those of traditional HTTP clients (Web browsers). The data expiration time is determined based on subsequent data fetches of the same resource. The first data retrieval records the 'expires' header. On subsequent fetches, the current time is compared to the expiration time stored in the local cache. If HTTP 'expires' header data isn't returned by the source data server, the Sponger will derive its own expiration time by evaluating the 'date' header and 'last-modified' HTTP headers.
After extracting entities from a web resource and converting them to an in-memory XML document, the entities must be transformed to the target ontology using XSLT and an appropriate stylesheet. A typical call sequence would be:
xt := xtree_doc (content); ... xd := DB.DBA.RDF_MAPPER_XSLT (registry_get ('_rdf_mappers_path_') || 'xslt/mbz2rdf.xsl', xt);
Because of the wide variation in the data mapped by cartridges, it is not possible to present a typical XSL stylesheet outline. The Examples section presented later includes detailed extracts from the MusicBrainz? cartridge's stylesheet which provide a good example of how to map to an ontology. Rather than attempting to be an XSLT tutorial, the material which follows offers some general guidelines.
Passing Parameters to the XSLT Processor
Virtuoso's XSLT processor will accept default values for global parameters from the optional third argument of the xslt() function. This argument, if specified, must be a vector of parameter names and values of the form vector(name1, value1,... nameN, valueN), where name1 ... nameN must be of type varchar, and value1 ... valueN may be of any Virtuoso datatype, but may not be null.
This extract from the Crunchbase cartridge shows how parameters may be passed to the XSLT processor. The function RDF_MAPPER_XSLT (in xslt varchar, inout xt any, in params any := null) passes the parameters vector directly to xslt().
xt := DB.DBA.RDF_MAPPER_XSLT ( registry_get ('_rdf_mappers_path_') || 'xslt/crunchbase2rdf.xsl', xt, vector ('baseUri', coalesce (dest, graph_iri), 'base', base, 'suffix', suffix) );
The corresponding stylesheet crunchbase2rdf.xsl retrieves the parameters baseUri, base and suffix as follows:
... <xsl:output method="xml" indent="yes" /> <xsl:variable name="ns">http://www.crunchbase.com/</xsl:variable> <xsl:param name="baseUri" /> <xsl:param name="base"/> <xsl:param name="suffix"/> <xsl:template name="space-name"> ...
An RDF Description Template
Defining A Generic Resource Description Wrapper
Many of the OpenLink cartridges create a resource description formed to a common "wrapper" template which describes the relationship between the (usually) non-RDF source resource being sponged and the RDF description generated by the Sponger. The wrapper is appropriate for resources which can broadly be conceived as documents. It provides a generic minimal description of the source document, but also links to the much more detailed description provided by the Sponger. So, instead of just emitting a resource description, the Sponger factors the container into the generated graph constituting the RDF description.
The template is depicted below:
![]() |
Figure: 14.6.1.3.6.1. Template |
To generate an RDF description corresponding to the wrapper template, a stylesheet containing the following block of instructions is used. This extract is taken from the eBay cartridge's stylesheet, ebay2rdf.xsl. Many of the OpenLink cartridges follow a similar pattern.
<xsl:param name="baseUri"/> ... <xsl:variable name="resourceURL"> <xsl:value-of select="$baseUri"/> </xsl:variable> ... <xsl:template match="/"> <rdf:RDF> <rdf:Description rdf:about="{$resourceURL}"> <rdf:type rdf:resource="Document"/> <rdf:type rdf:resource="Document"/> <rdf:type rdf:resource="Container"/> <sioc:container_of rdf:resource="{vi:proxyIRI ($resourceURL)}"/> <foaf:primaryTopic rdf:resource="{vi:proxyIRI ($resourceURL)}"/> <dcterms:subject rdf:resource="{vi:proxyIRI ($resourceURL)}"/> </rdf:Description> <rdf:Description rdf:about="{vi:proxyIRI ($resourceURL)}"> <rdf:type rdf:resource="Item"/> <sioc:has_container rdf:resource="{$resourceURL}"/> <xsl:apply-templates/> </rdf:Description> </rdf:RDF> </xsl:template> ...
Using SIOC as a Generic Container Model
The generic resource description wrapper just described uses SIOC to establish the container/contained relationship between the source resource and the generated graph. Although the most important classes for the generic wrapper are obviously Container and Item, SIOC provides a generic data model of containers, items, item types, and associations between items which can be combined with other vocabularies such as FOAF and Dublin Core.
SIOC defines a number of other classes, such as User, UserGroup, Role, Site, Forum and Post. A separate SIOC types module (T-SIOC) extends the SIOC Core ontology by defining subclasses and subproperties of SIOC terms. Subclasses include: AddressBook, BookmarkFolder, Briefcase, EventCalendar, ImageGallery, Wiki, Weblog, BlogPost, Wiki plus many others.
OpenLink Data Spaces (ODS) uses SIOC extensively as a data space "glue" ontology to describe the base data and containment hierarchy of all the items managed by ODS applications (Data Spaces). For example, ODS-Weblog is an application of type sioc:Forum. Each ODS-Weblog application instance contains blogs of type sioct:Weblog. Each blog is a sioc:container_of posts of type sioc:Post.
Generally, when deciding how to describe resources handled by your own custom cartridge, SIOC provides a useful framework for the description which complements the SIOC-based container model adopted throughout the ODS framework.
Naming Conventions for Sponger Generated Descriptions
As can be seen from the stylesheet extract just shown, the URI of the resource description generated by the Sponger to describe the sponged resource is given by the function {vi:proxyIRI ($resourceURL)} where resourceURL is the URL of the original resource being sponged. proxyIRI is an XPath extension function defined in rdf_mappers.sql as
xpf_extension ('http://www.openlinksw.com/virtuoso/xslt/:proxyIRI', 'DB.DBA.RDF_SPONGE_PROXY_IRI');
which maps to the Virtuoso/PL procedure DB.DBA.RDF_SPONGE_PROXY_IRI. This procedure in turn generates a resource description URI which typically takes the form: http://<hostName:port>/about/html/http/<resourceURL>#this
Once you have developed a cartridge, you must register it in the Cartridge Registry to have the SPARQL processor recognize and use it. You should have compiled your cartridge hook function first by issuing a "create procedure DB.DBA.RDF_LOAD_xxx ..." command through one of Virtuoso's SQL interfaces. You can create the required Cartridge Registry entry either by adding a row to the SYS_REF_MAPPERS table directly using SQL, or by using the Conductor UI.
Using SQL
If you choose register your cartridge using SQL, possibly as part of a Virtuoso/PL script, the required SQL will typically mirror one of the following INSERT commands.
Below, a cartridge for OpenCalais is being installed which will be tried when the MIME type of the data being sponged is one of text/plain, text/xml or text/html. (The definition of the SYS_RDF_MAPPERS table was introduced earlier in section 'Cartridge Registry'.)
insert soft DB.DBA.SYS_RDF_MAPPERS ( RM_PATTERN, RM_TYPE, RM_HOOK, RM_KEY, RM_DESCRIPTION, RM_ENABLED) values ( '(text/plain)|(text/xml)|(text/html)', 'MIME', 'DB.DBA.RDF_LOAD_CALAIS', null, 'Opencalais', 1);
As an alternative to matching on the content's MIME type, candidate cartridges to be tried in the conversion pipeline can be identified by matching the data source URL against a URL pattern stored in the cartridge's entry in the Cartridge Registry.
insert soft DB.DBA.SYS_RDF_MAPPERS ( RM_PATTERN, RM_TYPE, RM_HOOK, RM_KEY, RM_DESCRIPTION, RM_OPTIONS) values ( '(http://api.crunchbase.com/v/1/.*)|(http://www.crunchbase.com/.*)', 'URL', 'DB.DBA.RDF_LOAD_CRUNCHBASE', null, 'CrunchBase', null);
The value of RM_ID to set depends on where in the cartridge invocation order you want to position a particular cartridge. RM_ID should be set lower than 10028 to ensure the cartridge is tried before the ODS-Briefcase (WebDAV) metadata extractor, which is always the last mapper to be tried if no preceding cartridge has been successful.
UPDATE DB.DBA.SYS_RDF_MAPPERS SET RM_ID = 1000 WHERE RM_HOOK = 'DB.DBA.RDF_LOAD_BIN_DOCUMENT';
Using Conductor
Cartridges can be added manually using the 'Add' panel of the 'RDF Cartridges' screen.
![]() |
Figure: 14.6.1.3.6.1. RDF Cartridges |
![]() |
Figure: 14.6.1.3.6.2. RDF Cartridges |
Installing Stylesheets
Although you could place your cartridge stylesheet in any folder configured to be accessible by Virtuoso, the simplest option is to upload them to the DAV/VAD/rdf_mappers/xslt folder using the WebDAV browser accessible from the Conductor UI.
![]() |
Figure: 14.6.1.3.6.3. WebDAV browser |
Should you wish to locate your stylesheets elsewhere, ensure that the DirsAllowed setting in the virtuoso.ini file is configured appropriately.
To illustrate some of the material presented so far, we'll delve deeper into the MusicBrainz cartridge mentioned earlier.
MusicBrainz XML Web Service
The cartridge extracts data through the MusicBrainz XML Web Service using, as the basis for the initial query, an item type and MBID (MusicBrainz ID) extracted from the original URI submitted to the RDF proxy. A range of item types are supported including artist, release and track.
Using the album "Imagine" by John Lennon as an example, a standard HTML description of the album (which has an MBID of f237e6a0-4b0e-4722-8172-66f4930198bc) can be retrieved direct from MusicBrainz using the URL:
http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html
Alternatively, information can be extracted in XML form through the web service. A description of the tracks on the album can be obtained with the query:
http://musicbrainz.org/ws/1/release/f237e6a0-4b0e-4722-8172-66f4930198bc?type=xml&inc=tracks
The XML returned by the web service is shown below (only the first two tracks are shown for brevity):
<?xml version="1.0" encoding="UTF-8"?> <metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#" xmlns:ext="http://musicbrainz.org/ns/ext-1.0#"> <release id="f237e6a0-4b0e-4722-8172-66f4930198bc" type="Album Official" > <title>Imagine</title> <text-representation language="ENG" script="Latn"/> <asin>B0000457L2</asin> <track-list> <track id="b88bdafd-e675-4c6a-9681-5ea85ab99446"> <title>Imagine</title> <duration>182933</duration> </track> <track id="b38ce90d-3c47-4ccd-bea2-4718c4d34b0d"> <title>Crippled Inside</title> <duration>227906</duration> </track> . . . </track-list> </release> </metadata>
Although, as shown above, MusicBrainz defines its own XML Metadata Format to represent music metadata, the MusicBrainz sponger converts the raw data to a subset of the Music Ontology, an RDF vocabulary which aims to provide a set of core classes and properties for describing music on the Semantic Web. Part of the subset used is depicted in the following RDF graph (representing in this case a John Cale album).
![]() |
Figure: 14.6.1.3.6.1. RDF graph |
With the prefix mo: denoting the Music Ontology at http://purl.org/ontology/mo/, it can be seen that artists are represented by instances of class mo:Artist, their albums, records etc. by instances of class mo:Release and tracks on these releases by class mo:Track. The property foaf:made links an artist and his/her releases. Property mo:track links a release with the tracks it contains
RDF Output
An RDF description of the album can be obtained by sponging the same URL, i.e. by submitting it to the Sponger's proxy interface using the URL:
http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html
The extract below shows part of the (reorganized) RDF output returned by the Sponger for "Imagine". Only the album's title track is included.
<?xml version="1.0" encoding="utf-8" ?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> <rdf:Description rdf:about="http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html"> <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Document"/> </rdf:Description> <rdf:Description rdf:about="http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html"> <foaf:primaryTopic xmlns:foaf="http://xmlns.com/foaf/0.1/" rdf:resource="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html#this"/> </rdf:Description> <rdf:Description rdf:about="http://purl.org/ontology/mo/"> <rdf:type rdf:resource="http://www.openlinksw.com/schema/attribution#DataSource"/> </rdf:Description> ... <rdf:Description rdf:about="http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html"> <rdfs:isDefinedBy rdf:resource="http://purl.org/ontology/mo/"/> </rdf:Description> ... <!-- Record description --> <rdf:Description rdf:about="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html#this"> <rdf:type rdf:resource="http://purl.org/ontology/mo/Record"/> </rdf:Description> <rdf:Description rdf:about="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html#this"> <dc:title xmlns:dc="http://purl.org/dc/elements/1.1/">Imagine</dc:title> </rdf:Description> <rdf:Description rdf:about="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html#this"> <mo:release_status xmlns:mo="http://purl.org/ontology/mo/" rdf:resource="http://purl.org/ontology/mo/official"/> </rdf:Description> <rdf:Description rdf:about="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html#this"> <mo:release_type xmlns:mo="http://purl.org/ontology/mo/" rdf:resource="http://purl.org/ontology/mo/album"/> </rdf:Description> <!-- Title track description --> <rdf:Description rdf:about="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/release/f237e6a0-4b0e-4722-8172-66f4930198bc.html#this"> <mo:track xmlns:mo="http://purl.org/ontology/mo/" rdf:resource="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/track/b88bdafd-e675-4c6a-9681-5ea85ab99446.html#this"/> </rdf:Description> <rdf:Description rdf:about="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/track/b88bdafd-e675-4c6a-9681-5ea85ab99446.html#this"> <rdf:type rdf:resource="http://purl.org/ontology/mo/Track"/> </rdf:Description> <rdf:Description rdf:about="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/track/b88bdafd-e675-4c6a-9681-5ea85ab99446.html#this"> <dc:title xmlns:dc="http://purl.org/dc/elements/1.1/">Imagine</dc:title> </rdf:Description> <rdf:Description rdf:about="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/track/b88bdafd-e675-4c6a-9681-5ea85ab99446.html#this"> <mo:track_number xmlns:mo="http://purl.org/ontology/mo/">1</mo:track_number> </rdf:Description> <rdf:Description rdf:about="http://demo.openlinksw.com/about/rdf/http://musicbrainz.org/track/b88bdafd-e675-4c6a-9681-5ea85ab99446.html#this"> <mo:duration xmlns:mo="http://purl.org/ontology/mo/" rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">182933</mo:duration> </rdf:Description> </rdf:RDF>
Cartridge Hook Function
The cartridge's hook function is listed below. It is important to note that MusicBrainz supports a variety of query types, each of which returns a different set of information, depending on the item type being queried. Full details can be found on the MusicBrainz? site. The sponger cartridge is capable of handling all the query types supported by MusicBrainz? and is intended to be used in a drill-down scenario, as would be the case when using an RDF browser such as the OpenLink Data Explorer (ODE). This example focuses primarily on the types release and track.
create procedure DB.DBA.RDF_LOAD_MBZ ( in graph_iri varchar, in new_origin_uri varchar, in dest varchar, inout _ret_body any, inout aq any, inout ps any, inout _key any, inout opts any) { declare kind, id varchar; declare tmp, incs any; declare uri, cnt, hdr, inc, xd, xt varchar; tmp := regexp_parse ('http://musicbrainz.org/([^/]*)/([^\.]+)', new_origin_uri, 0); declare exit handler for sqlstate '*' { -- dbg_printf ('%s', __SQL_MESSAGE); return 0; }; if (length (tmp) < 6) return 0; kind := subseq (new_origin_uri, tmp[2], tmp[3]); id := subseq (new_origin_uri, tmp[4], tmp[5]); incs := vector (); if (kind = 'artist') { inc := 'aliases artist-rels label-rels release-rels track-rels url-rels'; incs := vector ( 'sa-Album', 'sa-Single', 'sa-EP', 'sa-Compilation', 'sa-Soundtrack', 'sa-Spokenword', 'sa-Interview', 'sa-Audiobook', 'sa-Live', 'sa-Remix', 'sa-Other' , 'va-Album', 'va-Single', 'va-EP', 'va-Compilation', 'va-Soundtrack', 'va-Spokenword', 'va-Interview', 'va-Audiobook', 'va-Live', 'va-Remix', 'va-Other' ); } else if (kind = 'release') inc := 'artist counts release-events discs tracks artist-rels label-rels release-rels track-rels url-rels track-level-rels labels'; else if (kind = 'track') inc := 'artist releases puids artist-rels label-rels release-rels track-rels url-rels'; else if (kind = 'label') inc := 'aliases artist-rels label-rels release-rels track-rels url-rels'; else return 0; if (dest is null) DELETE FROM DB.DBA.RDF_QUAD WHERE G = DB.DBA.RDF_MAKE_IID_OF_QNAME (graph_iri); DB.DBA.RDF_LOAD_MBZ_1 (graph_iri, new_origin_uri, dest, kind, id, inc); DB.DBA.TTLP (sprintf ('<%S> <http://xmlns.com/foaf/0.1/primaryTopic> <%S> .\n<%S> a <http://xmlns.com/foaf/0.1/Document> .', new_origin_uri, DB.DBA.RDF_SPONGE_PROXY_IRI (new_origin_uri), new_origin_uri), '', graph_iri); foreach (any inc1 in incs) do { DB.DBA.RDF_LOAD_MBZ_1 (graph_iri, new_origin_uri, dest, kind, id, inc1); } return 1; };
The hook function uses a subordinate procedure RDF_LOAD_MBZ_1:
create procedure DB.DBA.RDF_LOAD_MBZ_1 (in graph_iri varchar, in new_origin_uri varchar, in dest varchar, in kind varchar, in id varchar, in inc varchar) { declare uri, cnt, xt, xd, hdr any; uri := sprintf ('http://musicbrainz.org/ws/1/%s/%s?type=xml&inc=%U', kind, id, inc); cnt := RDF_HTTP_URL_GET (uri, '', hdr, 'GET', 'Accept: */*'); xt := xtree_doc (cnt); xd := DB.DBA.RDF_MAPPER_XSLT (registry_get ('_rdf_mappers_path_') || 'xslt/mbz2rdf.xsl', xt, vector ('baseUri', new_origin_uri)); xd := serialize_to_UTF8_xml (xd); DB.DBA.RM_RDF_LOAD_RDFXML (xd, new_origin_uri, coalesce (dest, graph_iri)); };
XSLT Stylesheet
The key sections of the MusicBrainz XSLT template relevant to this example are listed below. Only the sections relating to an artist, his releases, or the tracks on those releases, are shown.
<!DOCTYPE xsl:stylesheet [ <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#"> <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#"> <!ENTITY mo "http://purl.org/ontology/mo/"> <!ENTITY foaf "http://xmlns.com/foaf/0.1/"> <!ENTITY mmd "http://musicbrainz.org/ns/mmd-1.0#"> <!ENTITY dc "http://purl.org/dc/elements/1.1/"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vi="http://www.openlinksw.com/virtuoso/xslt/" xmlns:rdf="" xmlns:rdfs="" xmlns:foaf="" xmlns:mo="" xmlns:mmd="" xmlns:dc="" > <xsl:output method="xml" indent="yes" /> <xsl:variable name="base" select="'http://musicbrainz.org/'"/> <xsl:variable name="uc">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> <xsl:variable name="lc">abcdefghijklmnopqrstuvwxyz</xsl:variable> <xsl:template match="/mmd:metadata"> <rdf:RDF> <xsl:apply-templates /> </rdf:RDF> </xsl:template> ... <xsl:template match="mmd:artist[@type='Person']"> <mo:MusicArtist rdf:about="{vi:proxyIRI (concat($base,'artist/',@id,'.html'))}"> <foaf:name><xsl:value-of select="mmd:name"/></foaf:name> <xsl:for-each select="mmd:release-list/mmd:release|mmd:relation-list[@target-type='Release']/mmd:relation/mmd:release"> <foaf:made rdf:resource="{vi:proxyIRI (concat($base,'release/',@id,'.html'))}"/> </xsl:for-each> </mo:MusicArtist> <xsl:apply-templates /> </xsl:template> <xsl:template match="mmd:release"> <mo:Record rdf:about="{vi:proxyIRI (concat($base,'release/',@id,'.html'))}"> <dc:title><xsl:value-of select="mmd:title"/></dc:title> <mo:release_type rdf:resource="{translate (substring-before (@type, ' '), $uc, $lc)}"/> <mo:release_status rdf:resource="{translate (substring-after (@type, ' '), $uc, $lc)}"/> <xsl:for-each select="mmd:track-list/mmd:track"> <mo:track rdf:resource="{vi:proxyIRI (concat($base,'track/',@id,'.html'))}"/> </xsl:for-each> </mo:Record> <xsl:apply-templates select="mmd:track-list/mmd:track"/> </xsl:template> <xsl:template match="mmd:track"> <mo:Track rdf:about="{vi:proxyIRI (concat($base,'track/',@id,'.html'))}"> <dc:title><xsl:value-of select="mmd:title"/></dc:title> <mo:track_number><xsl:value-of select="position()"/></mo:track_number> <mo:duration rdf:datatype="integer"> <xsl:value-of select="mmd:duration"/> </mo:duration> <xsl:if test="artist[@id]"> <foaf:maker rdf:resource="{vi:proxyIRI (concat ($base, 'artist/', artist/@id, '.html'))}"/> </xsl:if> <mo:musicbrainz rdf:resource="{vi:proxyIRI (concat ($base, 'track/', @id, '.html'))}"/> </mo:Track> </xsl:template> ... <xsl:template match="text()"/> </xsl:stylesheet>
Used to extract RDF from a Web Data Source the Virtuoso Sponger Cartridge RDF Extractor consumes services from: Virtuoso PL, C/C++, Java based RDF Extractors
The RDF mappers provide a way to extract metadata from non-RDF documents such as HTML pages, images Office documents etc. and pass to SPARQL sponger (crawler which retrieve missing source graphs). For brevity further in this article the "RDF mapper" we simply will call "mapper".
The mappers consist of PL procedure (hook) and extractor, where extractor itself can be built using PL, C or any external language supported by Virtuoso server.
Once the mapper is developed it must be plugged into the SPARQL engine by adding a record in the table DB.DBA.SYS_RDF_MAPPERS.
If a SPARQL query instructs the SPARQL processor to retrieve target graph into local storage, then the SPARQL sponger will be invoked. If the target graph IRI represents a dereferenceable URL then content will be retrieved using content negotiation. The next step is the content type to be detected:
PL hook requirements:
Every PL function used to plug a mapper into SPARQL engine must have following parameters in the same order:
Note: the names of the parameters are not important, but their order and presence are!
Example Implementation:
In the example script bellow we implement a basic mapper, which maps a text/plain mime type to an imaginary ontology, which extends the class Document from FOAF with properties 'txt:UniqueWords' and 'txt:Chars', where the prefix 'txt:' we specify as 'urn:txt:v0.0:'.
use DB; create procedure DB.DBA.RDF_LOAD_TXT_META ( in graph_iri varchar, in new_origin_uri varchar, in dest varchar, inout ret_body any, inout aq any, inout ps any, inout ser_key any ) { declare words, chars int; declare vtb, arr, subj, ses, str any; declare ses any; -- if any error we just say nothing can be done declare exit handler for sqlstate '*' { return 0; }; subj := coalesce (dest, new_origin_uri); vtb := vt_batch (); chars := length (ret_body); -- using the text index procedures we get a list of words vt_batch_feed (vtb, ret_body, 1); arr := vt_batch_strings_array (vtb); -- the list has 'word' and positions array, so we must divide by 2 words := length (arr) / 2; ses := string_output (); -- we compose a N3 literal http (sprintf ('<%s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Document> .\n', subj), ses); http (sprintf ('<%s> <urn:txt:v0.0:UniqueWords> "%d" .\n', subj, words), ses); http (sprintf ('<%s> <urn:txt:v0.0:Chars> "%d" .\n', subj, chars), ses); str := string_output_string (ses); -- we push the N3 text into the local store DB.DBA.TTLP (str, new_origin_uri, subj); return 1; }; DELETE FROM DB.DBA.SYS_RDF_MAPPERS WHERE RM_HOOK = 'DB.DBA.RDF_LOAD_TXT_META'; INSERT SOFT DB.DBA.SYS_RDF_MAPPERS (RM_PATTERN, RM_TYPE, RM_HOOK, RM_KEY, RM_DESCRIPTION) VALUES ('(text/plain)', 'MIME', 'DB.DBA.RDF_LOAD_TXT_META', null, 'Text Files (demo)'); -- here we set order to some large number so don't break existing mappers update DB.DBA.SYS_RDF_MAPPERS SET RM_ID = 2000 WHERE RM_HOOK = 'DB.DBA.RDF_LOAD_TXT_META';
To test the mapper we just use /sparql endpoint with option 'Retrieve remote RDF data for all missing source graphs' to execute:
SELECT * FROM <URL-of-a-txt-file> WHERE { ?s ?p ?o }
It is important that the SPARQL_UPDATE role to be granted to "SPARQL" account in order to allow local repository update via sponge feature.
Authentication in Sponger
To enable usage of user defined authentication, there are added more parameters to the /proxy/rdf and /sparql endpoints. So to use it, the RDF browser and iSPARQL should send following url parameters:
'login=<account name>'
get-login=<account name>
The table DB.DBA.SYS_RDF_MAPPERS is used as registry for registering RDF mappers.
create table DB.DBA.SYS_RDF_MAPPERS ( RM_ID integer identity, -- mapper ID, designate order of execution RM_PATTERN varchar, -- a REGEX pattern to match URL or MIME type RM_TYPE varchar default 'MIME', -- what property of the current resource to match: MIME or URL are supported at present RM_HOOK varchar, -- fully qualified PL function name e.q. DB.DBA.MY_MAPPER_FUNCTION RM_KEY long varchar, -- API specific key to use RM_DESCRIPTION long varchar, -- Mapper description, free text RM_ENABLED integer default 1, -- a flag 0 or 1 integer to include or exclude the given mapper from processing chain primary key (RM_TYPE, RM_PATTERN)) ;
The current way to register/update/unregister a mapper is just a DML statement e.g. NSERT/UPDATE/DELETE.
Execution order and processingWhen SPARQL retrieves a resource with unknown content it will look in the mappers registry and will loop over every record having RM_ENABLED flag true. The sequence of look-up is based on ordering by RM_ID column. For every record it will either try matching the MIME type or URL against RM_PATTERN value and if there is match the function specified in RM_HOOK column will be called. If the function doesn't exists or signal an error the SPARQL will look at next record.
When it stops looking? It will stop if value returned by mapper function is positive or negative number, if the return is negative processing stops with meaning no RDF was supplied, if return is positive the meaning is that RDF data was extracted, if zero integer is returned then SPARQL will look for next mapper. The mapper function also can return zero if it is expected next mapper in the chain to get more RDF data.
If none of the mappers matches the signature (MIME type nor URL) the built-in WebDAV metadata extractor will be called.
Extension functionThe mapper function is a PL stored procedure with following signature:
THE_MAPPER_FUNCTION_NAME ( in graph_iri varchar, in origin_uri varchar, in destination_uri varchar, inout content varchar, inout async_notification_queue any, inout ping_service any, inout keys any ) { -- do processing here -- return -1, 0 or 1 (as explained above in Execution order and processing section) } ;
Parameters
Return value
The Virtuoso supply as a rdf_mappers_dav VAD package a cartridge for extracting RDF data from certain popular Web resources and file types. It can be installed (if not already) using VAD_INSTALL function, see the VAD chapter in documentation on how to do that.
HTTP-in-RDF
Maps the HTTP request response to HTTP Vocabulary in RDF, see http://www.w3.org/2006/http#.
This mapper is disabled by default. If it's enabled , it must be first in order of execution.
Also it always will return 0, which means any other mapper should push more data.
HTML
This mapper is composite, it looking for metadata which can specified in a HTML pages as follows:
<link rel="meta" type="application/rdf+xml"
The HTML page mapper will look for RDF data in order as listed above, it will try to extract metadata on each step and will return positive flag if any of the above step give a RDF data. In case where page URL matches some of other RDF mappers listed in registry it will return 0 so next mapper to extract more data. In order to function properly, this mapper must be executed before any other specific mappers.
Flickr URLs
This mapper extracts metadata of the Flickr images, using Flickr REST API. To function properly it must have configured key. The Flickr mapper extracts metadata using: CC license, Dublin Core, Dublin Core Metadata Terms, GeoURL, FOAF, EXIF: http://www.w3.org/2003/12/exif/ns/ ontology.
Amazon URLs
This mapper extracts metadata for Amazon articles, using Amazon REST API. It needs a Amazon API key in order to be functional.
eBay URLs
Implements eBay REST API for extracting metadata of eBay articles, it needs a key and user name to be configured in order to work.
Open Office (OO) documents
The OO documents contains metadata which can be extracted using UNZIP, so this extractor needs Virtuoso unzip plugin to be configured on the server.
Yahoo traffic data URLs
Implements transformation of the result of Yahoo traffic data to RDF.
iCal files
Transform iCal files to RDF as per http://www.w3.org/2002/12/cal/ical# .
Binary content, PDF, PowerPoint
The unknown binary content, PDF and MS PowerPoint files can be transformed to RDF using Aperture framework (http://aperture.sourceforge.net/). This mapper needs Virtuoso with Java hosting support, Aperture framework and MetaExtractor.class installed on the host system in order to work.
The Aperture framework & MetaExtractor.class must be installed on the system before to install the RDF mappers package. If the package is already installed, then to activate this mapper you can just re-install the VAD.
Setting-up Virtuoso with Java hosting to run Aperture framework
JavaClasspath = lib:aperture/DFKIUtils2.jar:aperture/JempBox-0.2.0.jar:aperture/activation-1.0.2-upd2.jar:aperture/aduna-commons-xml-2.0.jar: aperture/ant-compression-utils-1.7.1.jar:aperture/aperture-1.2.0.jar:aperture/aperture-examples-1.2.0.jar:aperture/aperture-test-1.2.0.jar: aperture/applewrapper-0.2.jar:aperture/bcmail-jdk14-132.jar:aperture/bcprov-jdk14-132.jar:aperture/commons-codec-1.3.jar:aperture/commons-httpclient-3.1.jar: aperture/commons-lang-2.3.jar:aperture/demork-2.1.jar:aperture/flickrapi-1.0.jar:aperture/fontbox-0.2.0-dev.jar:aperture/htmlparser-1.6.jar: aperture/ical4j-1.0-beta4.jar:aperture/infsail-0.1.jar:aperture/jacob-1.10.jar:aperture/jai_codec-1.1.3.jar:aperture/jai_core-1.1.3.jar:aperture/jaudiotagger-1.0.8.jar: aperture/jcl104-over-slf4j-1.5.0.jar:aperture/jpim-0.1-aperture-1.jar:aperture/junit-3.8.1.jar:aperture/jutf7-0.9.0.jar:aperture/mail-1.4.jar: aperture/metadata-extractor-2.4.0-beta-1.jar:aperture/mstor-0.9.11.jar:aperture/nrlvalidator-0.1.jar:aperture/openrdf-sesame-2.2.1-onejar-osgi.jar: aperture/osgi.core-4.0.jar:aperture/pdfbox-0.7.4-dev-20071030.jar:aperture/poi-3.0.2-FINAL-20080204.jar:aperture/poi-scratchpad-3.0.2-FINAL-20080204.jar: aperture/rdf2go.api-4.6.2.jar:aperture/rdf2go.impl.base-4.6.2.jar:aperture/rdf2go.impl.sesame20-4.6.2.jar:aperture/rdf2go.impl.util-4.6.2.jar: aperture/slf4j-api-1.5.0.jar:aperture/slf4j-jdk14-1.5.0.jar:aperture/unionsail-0.1.jar:aperture/winlaf-0.5.1.jar
To check the cartridge has been configured, connect with Virtuoso's ISQL tool:
SQL > SELECT udt_is_available('APERTURE.DBA.MetaExtractor');
SQL> SELECT APERTURE.DBA."MetaExtractor"().getMetaFromFile ('some_pdf_in_server_working_dir.pdf', 0); ... some RDF data should be returned ...
You should now be able to sponge all document types supported by the Aperture framework, (using one of the standard Sponger invocation mechanisms, for instance with a URL of the form http://localhost:8890/about/rdf/http://targethost/targetfile.pdf), subject to the MIME type pattern filters configured for the cartridge in the Conductor UI. By default the Aperture cartridge is registered to match MIME types (application/octet-stream)|(application/pdf)|(application/mspowerpoint). To sponge all the MIME types Aperture is capable of handling, changed the MIME type pattern to 'application/.*'.
Important: The installation guidelines presented above have been verified on Mac OS X with Aperture 1.2.0. Some adjustment may be needed for different operating systems or versions of Aperture.
Examples & tutorials
How to write own RDF mapper? Look at Virtuoso tutorial on this subject http://demo.openlinksw.com/tutorial/rdf/rd_s_1/rd_s_1.vsp .
So far the discussion has centered on 'primary' cartridges. However, Virtuoso supports an alternative type of cartridge, a 'meta-cartridge'. The way a meta-cartridge operates is essentially the same as a primary cartridge, that is it has a cartridge hook function with the same signature and its inserts data into the quad store through entity extraction and ontology mapping as before. Where meta-cartridges differ from primary cartridges is in their intent and their position in the cartridge invocation pipeline.
The purpose of meta-cartridges is to enrich graphs produced by other (primary) cartridges. They serve as general post-processors to add additional information about selected entities in an RDF graph. For instance, a particular meta-cartridge might be designed to search for entities of type 'umbel:Country' in a given graph, and then add additional statements about each country it finds, where the information contained in these statements is retrieved from the web service targeted by the meta-cartridge. One such example might be a 'World Bank' meta-cartridge which adds information relating to a country's GDP, its exports of goods and services as a percentage of GDP etc; retrieved using the World Bank web service API. In order to benefit from the World Bank meta-cartridge, any primary cartridge which might generate instance data relating to countries should ensure that each country instance it handles is also described as being of rdf:type 'umbel:Country'. Here, the UMBEL (Upper Mapping and Binding Exchange Layer) ontology is used as a data-source-agnostic classification system. It provides a core set of 20,000+ subject concepts which act as "a fixed set of reference points in a global knowledge space". The use of UMBEL in this way serves to decouple meta-cartridges from primary cartridges and data source specific ontologies.
Virtuoso includes two default meta-cartridges which use UMBEL and OpenCalais to augment source graphs.
Registration
Meta-cartridges must be registered in the RDF_META_CARTRIDGES table, which fulfills a role similar to the SYS_RDF_MAPPERS table used by primary cartridges. The structure of the table, and the meaning and use of its columns, are similar to SYS_RDF_MAPPERS. The meta-cartridge hook function signature is identical to that for primary cartridges.
The RDF_META_CARTRIDGES table definition is as follows:
create table DB.DBA.RDF_META_CARTRIDGES ( MC_ID INTEGER IDENTITY, -- meta-cartridge ID. Determines the order of the meta-cartridge's invocation in the Sponger processing chain MC_SEQ INTEGER IDENTITY, MC_HOOK VARCHAR, -- fully qualified Virtuoso/PL function name MC_TYPE VARCHAR, MC_PATTERN VARCHAR, -- a REGEX pattern to match resource URL or MIME type MC_KEY VARCHAR, -- API specific key to use MC_OPTIONS ANY, -- meta-cartridge specific options MC_DESC LONG VARCHAR, -- meta-cartridge description (free text) MC_ENABLED INTEGER -- a 0 or 1 integer flag to exclude or include meta-cartridge from Sponger processing chain );
(At the time of writing there is no Conductor UI for registering meta-cartridges, they must be registered using SQL. A Conductor interface for this task will be added in due course.)
Invocation
Meta-cartridges are invoked through the post-processing hook procedure RDF_LOAD_POST_PROCESS which is called, for every document retrieved, after RDF_LOAD_RDFXML loads sponged data into the quad store.
Cartridges in the meta-cartridge registry (RDF_META_CARTRIDGES) are configured to match a given MIME type or URI pattern. Matching meta-cartridges are invoked in order of their MC_SEQ value. Ordinarily a meta-cartridge should return 0, in which case the next meta-cartridge in the post-processing chain will be invoked. If it returns 1 or -1, the post-processing stops and no further meta-cartridges are invoked.
The order of processing by the Sponger cartridge pipeline is thus:
Notice that meta-cartridges may be invoked even if primary cartridges are not.
Note
The example which follows builds on a Freebase Sponger cartridge developed prior to the announcement of Freebase's support for generating Linked Data through the endpoint http://rdf.freebase.com/ . The OpenLink cartridge has since evolved to reflect these changes. A snapshot of the Freebase cartridge and stylesheet compatible with this example can be found in Appendix C.
Freebase is an open community database of the world's information which serves facts and statistics rather than articles. Its designers see this difference in emphasis from article-oriented databases as beneficial for developers wanting to use Freebase facts in other websites and applications.
Virtuoso includes a Freebase cartridge in the rdf_mappers VAD. The aim of the example cartridge presented here is to provide a lightweight meta-cartridge that is used to conditionally add triples to graphs generated by the Freebase cartridge, if Freebase is describing a U.S. senator.
New York Times Campaign Finance (NYTCF) API
The New York Times Campaign Finance (NYTCF) API allows you to retrieve contribution and expenditure data based on United States Federal Election Commission filings. You can retrieve totals for a particular presidential candidate, see aggregates by ZIP code or state, or get details on a particular donor.
The API supports a number of query types. To keep this example from being overly long, the meta-cartridge supports just one of these - a query for the candidate details. An example query and the resulting output follow:
Query:
http://api.nytimes.com/svc/elections/us/v2/president/2008/finances/candidates/obama,barack.xml?api-key=xxxx
Result:
<result_set> <status>OK</status> <copyright> Copyright (c) 2008 The New York Times Company. All Rights Reserved. </copyright> <results> <candidate> <candidate_name>Obama, Barack</candidate_name> <committee_id>C00431445</committee_id> <party>D</party> <total_receipts>468841844</total_receipts> <total_disbursements>391437723.5</total_disbursements> <cash_on_hand>77404120</cash_on_hand> <net_individual_contributions>426902994</net_individual_contributions> <net_party_contributions>150</net_party_contributions> <net_pac_contributions>450</net_pac_contributions> <net_candidate_contributions>0</net_candidate_contributions> <federal_funds>0</federal_funds> <total_contributions_less_than_200>222694981.5</total_contributions_less_than_200> <total_contributions_2300>76623262</total_contributions_2300> <net_primary_contributions>46444638.81</net_primary_contributions> <net_general_contributions>30959481.19</net_general_contributions> <total_refunds>2058240.92</total_refunds> <date_coverage_from>2007-01-01</date_coverage_from> <date_coverage_to>2008-08-31</date_coverage_to> </candidate> </results> </result_set>
Sponging Freebase
Using OpenLink Data Explorer
The following instructions assume you have the OpenLink Data Explorer (ODE) browser extension installed in your browser.
An HTML description of Barack Obama can be obtained directly from Freebase by pasting the following URL into your browser: http://www.freebase.com/view/en/barack_obama
To view RDF data sponged from this page, select 'Linked Data Sources' from the browser's 'View' menu. An OpenLink Data Explorer interface will load in a new tab.
Clicking on the 'Barack Obama' link under the 'Person' category displayed by ODE sponges RDF data using the Freebase cartridge. Click the 'down arrow' adjacent to the 'Barack Obama' link to explore the retrieved data.
Assuming your Virtuoso instance is running on port 8890 on localhost, the list of data caches displayed by ODE should include: http://localhost:8890/about/html/http/www.freebase.com/view/en/barack_obama#this
The information displayed in the rest of the page relates to the entity instance identified by this URI. The prefix http://localhost:8890/about/html/http/ prepended to the original URI indicates that the Sponger Proxy Service has been invoked. The Sponger creates an associated entity instance (identified by the above URI with the #this suffix) which holds sponged information about the original entity.
Using the Command Line
As an alternative to ODE, you can sponge from the command line with the command:
curl -H "Accept: text/xml" "http://localhost:8890/about/html/http/www.freebase.com/view/en/barack_obama"
To view the results, you can use Conductor's browser-based SPARQL interface (e.g. http://localhost:8890/sparql) to query the resulting graph generated by the Sponger, http://www.freebase.com/view/en/barack_obama.
Installing the Meta-Cartridge
To register the meta-cartridge, a procedure similar to the following can be used:
create procedure INSTALL_RDF_LOAD_NYTCF () { -- delete any previous NYTCF cartridge installed as a primary cartridge DELETE FROM SYS_RDF_MAPPERS WHERE RM_HOOK = 'DB.DBA.RDF_LOAD_NYTCF'; -- register in the meta-cartridge post-processing chain INSERT SOFT DB.DBA.RDF_META_CARTRIDGES (MC_PATTERN, MC_TYPE, MC_HOOK, MC_KEY, MC_DESC, MC_OPTIONS) VALUES ( 'http://www.freebase.com/view/.*', 'URL', 'DB.DBA.RDF_LOAD_NYTCF', '2c1d95a62e5fxxxxx', 'Freebase NYTCF', vector ()); };
Looking at the list of cartridges in Conductor's 'RDF Cartridges' screen, you will see that the Freebase cartridge is configured by default to sponge URIs which match the pattern "http://www.freebase.com/view/.*" The meta-cartridge is configured to match on the same URI pattern.
To use the Campaign Finance API, you must register and request an API key. The script above shows an invalid key. Replace it with your own key before executing the procedure.
NYTCF Meta-Cartridge Functions
The meta-cartridge function definitions are listed below. They can be executed by pasting them into Conductor's iSQL interface.
-- New York Times: Campaign Finance Web Service -- See http://developer.nytimes.com/docs/campaign_finance_api -- DB.DBA.RDF_NYTCF_LOOKUP is in effect a lightweight lookup cartridge that is used -- to conditionally add triples to graphs generated by the Wikipedia and -- Freebase cartridges. These cartridges call on RDF_NYTCF_LOOKUP when -- handling an entity of rdf:type yago:Congressman109955781. The NYTCF lookup -- cartridge (aka a metacartridge) is used to return campaign finance data -- for the candidate in question retrieved from the New York Times Campaign -- Finance web service. create procedure DB.DBA.RDF_NYTCF_LOOKUP( in candidate_id any, -- id of candidate in graph_iri varchar, -- graph into which the additional campaign finance triples should be loaded in api_key varchar -- NYT finance API key ) { declare version, campaign_type, year any; declare nyt_url, hdr, tmp any; declare xt, xd any; -- Common parameters - The NYT API only supports the following values at present: version := 'v2'; campaign_type := 'president'; year := '2008'; -- Candidate summaries -- nyt_url := sprintf('http://api.nytimes.com/svc/elections/us/%s/%s/%s/finances/totals.xml?api-key=%s', -- version, campaign_type, year, api_key); -- Candidate details nyt_url := sprintf('http://api.nytimes.com/svc/elections/us/%s/%s/%s/finances/candidates/%s.xml?api-key=%s', version, campaign_type, year, candidate_id, api_key); tmp := http_client_ext (nyt_url, headers=>hdr, proxy=>connection_get ('sparql-get:proxy')); if (hdr[0] not like 'HTTP/1._ 200 %') signal ('22023', trim(hdr[0], '\r\n'), 'DB.DBA.RDF_LOAD_NYTCF_LOOKUP'); xd := xtree_doc (tmp); -- baseUri specifies what the generated RDF description is about -- <rdf:Description rdf:about="{baseUri}"> -- Example baseUri's: -- http://localhost:8890/about/rdf/http://www.freebase.com/view/en/barack_obama#this -- http://localhost:8890/about/rdf/http://www.freebase.com/view/en/hillary_rodham_clinton#this declare path any; declare lang, k, base_uri varchar; if (graph_iri like 'http://rdf.freebase.com/ns/%.%') base_uri := graph_iri; else { path := split_and_decode (graph_iri, 0, '%\0/'); k := path [length(path) - 1]; lang := path [length(path) - 2]; base_uri := sprintf ('http://rdf.freebase.com/ns/%U.%U', lang, k); } xt := DB.DBA.RDF_MAPPER_XSLT (registry_get ('_rdf_mappers_path_') || 'xslt/nytcf2rdf.xsl', xd, vector ('baseUri', base_uri)); xd := serialize_to_UTF8_xml (xt); DB.DBA.RDF_LOAD_RDFXML (xd, '', graph_iri); } ; create procedure DB.DBA.RDF_MQL_RESOURCE_IS_SENATOR ( in fb_graph_uri varchar -- URI of graph containing Freebase resource ) { -- Check if the resource described by Freebase is a U.S. senator. Only then does it make sense to query for campaign finance -- data from the NYT data space. -- -- To test for senators, we start by looking for two statements in the Freebase cartridge output, similar to: -- -- <rdf:Description rdf:about="http://localhost:8890/about/rdf/http://www.freebase.com/view/en/hillary_rodham_clinton#this"> -- <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person"/> -- <rdfs:seeAlso rdf:resource="http://en.wikipedia.org/wiki/Hillary_Rodham_Clinton"/> -- ... -- where the graph generated by the Sponger will be <http://www.freebase.com/view/en/hillary_rodham_clinton> -- -- To test whether a resource is a senator: -- 1) Check whether the Freebase resource is of rdf:type foaf:Person -- 2) Extract the person_name from the Wikipedia URI referenced by rdfs:seeAlso -- 3) Use the extracted person_name to build a URI to DBpedia's description of the person. -- 4) Query the DBpedia description to see if the person is of rdf:type yago:Senator110578471 declare xp, xt, tmp any; declare qry varchar; -- SPARQL query declare qry_uri varchar; -- query URI declare qry_res varchar; -- query result declare dbp_resource_name varchar; -- Equivalent resource name in DBpedia declare fb_resource_uri varchar; -- Freebase resource URI declare path any; declare lang, k varchar; declare exit handler for sqlstate '*' { return 0; }; if (fb_graph_uri like 'http://rdf.freebase.com/ns/%.%') fb_resource_uri := fb_graph_uri; else { path := split_and_decode (fb_graph_uri, 0, '%\0/'); if (length (path) < 2) return 0; k := path [length(path) - 1]; lang := path [length(path) - 2]; fb_resource_uri := sprintf ('http://rdf.freebase.com/ns/%U.%U', lang, k); } -- 1) Check whether the Freebase resource is a politician from united_states { declare stat, msg varchar; declare mdata, rset any; qry := sprintf ('sparql ask from <%s> where { <%s> <http://rdf.freebase.com/ns/people.person.profession> <http://rdf.freebase.com/ns/en.politician> ; <http://rdf.freebase.com/ns/people.person.nationality> <http://rdf.freebase.com/ns/en.united_states> . }', fb_graph_uri, fb_resource_uri); exec (qry, stat, msg, vector(), 1, mdata, rset); if (length(rset) = 0 or rset[0][0] <> 1) return 0; } return 1; } ; create procedure DB.DBA.RDF_LOAD_NYTCF_META (in graph_iri varchar, in new_origin_uri varchar, in dest varchar, inout _ret_body any, inout aq any, inout ps any, inout _key any, inout opts any) { declare candidate_id, candidate_name any; declare api_key any; declare indx, tmp any; declare ord int; declare exit handler for sqlstate '*' { return 0; }; if (not DB.DBA.RDF_MQL_RESOURCE_IS_SENATOR (new_origin_uri)) return 0; -- TO DO: hardcoded for now -- Need a mechanism to specify API key for meta-cartridges -- Could retrieve from virtuoso.ini? api_key := _key; -- NYT API supports a candidate_id in one of two forms: -- candidate_id ::= {candidate_ID} | {last_name [,first_name]} -- first_name is optional. If included, there should be no space after the comma. -- -- However, because this meta cartridge supplies additional triples for the -- Wikipedia or Freebase cartridges, only the second form of candidate_id is -- supported. i.e. We extract the candidate name, rather than a numeric -- candidate_ID (FEC committee ID) from the Wikipedia or Freebase URL. -- -- It's assumed that the source URI includes the candidate's first name. -- If it is omitted, the NYT API will return information about *all* candidates -- with that last name - something we don't want. indx := strstr(graph_iri, 'www.freebase.com/view/en/'); if (indx is not null) { -- extract candidate_id from Freebase URI tmp := sprintf_inverse(subseq(graph_iri, indx), 'www.freebase.com/view/en/%s', 0); if (length(tmp) <> 1) return 0; candidate_name := tmp[0]; } else { indx := strstr(graph_iri, 'wikipedia.org/wiki/'); if (indx is not null) { -- extract candidate_id from Wikipedia URI tmp := sprintf_inverse(subseq(graph_iri, indx), 'wikipedia.org/%s', 0); if (length(tmp) <> 1) return 0; candidate_name := tmp[0]; } else { tmp := sprintf_inverse(graph_iri, 'http://%s.freebase.com/ns/%s/%s', 0); if (length (tmp) <> 3) tmp := sprintf_inverse(graph_iri, 'http://%s.freebase.com/ns/%s.%s', 0); if (length (tmp) <> 3) return 0; candidate_name := tmp[2]; } } -- split candidate_name into its component parts -- candidate_name is assumed to be firstname_[middlename_]*lastname -- e.g. hillary_rodham_clinton (Freebase), Hillary_clinton (Wikipedia) { declare i, _end, len int; declare names, tmp_name varchar; names := vector (); tmp_name := candidate_name; len := length (tmp_name); while (1) { _end := strchr(tmp_name, '_'); if (_end is not null) { names := vector_concat (names, vector(subseq(tmp_name, 0, _end))); tmp_name := subseq(tmp_name, _end + 1); } else { names := vector_concat(names, vector(tmp_name)); goto done; } } done: if (length(names) < 2) return 0; -- candidate_id ::= lastname,firstname candidate_id := sprintf('%s,%s', names[length(names)-1], names[0]); } DB.DBA.RDF_NYTCF_LOOKUP(candidate_id, coalesce (dest, graph_iri), api_key); return 0; } ;
NYTCF Meta-Cartridge Stylesheet
The XSLT stylesheet, nyctf2rdf.xsl, used by the meta-cartridge to transform the base Campaign Finance web service output to RDF is shown below. RDF_NYCTF_LOOKUP() assumes the stylesheet is located alongside the other stylesheets provided by the rdf_mappers VAD in the Virtuoso WebDAV folder DAV/VAD/rdf_mappers/xslt. You should create nyctf2rdf.xsl here from the following listing. The WebDAV Browser interface in Conductor provides the easiest means to upload the stylesheet.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xsl:stylesheet [ <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <!ENTITY nyt "http://www.nytimes.com/"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vi="http://www.openlinksw.com/virtuoso/xslt/" xmlns:rdf="" xmlns:nyt="" > <xsl:output method="xml" indent="yes" /> <xsl:template match="/result_set/status"> <xsl:if test="text() = 'OK'"> <xsl:apply-templates mode="ok" select="/result_set/results/candidate"/> </xsl:if> </xsl:template> <xsl:template match="candidate" mode="ok"> <rdf:Description rdf:about="{vi:proxyIRI($baseUri)}"> <nyt:candidate_name><xsl:value-of select="candidate_name"/></nyt:candidate_name> <nyt:committee_id><xsl:value-of select="committee_id"/></nyt:committee_id> <nyt:party><xsl:value-of select="party"/></nyt:party> <nyt:total_receipts><xsl:value-of select="total_receipts"/></nyt:total_receipts> <nyt:total_disbursements> <xsl:value-of select="total_disbursements"/> </nyt:total_disbursements> <nyt:cash_on_hand><xsl:value-of select="cash_on_hand"/></nyt:cash_on_hand> <nyt:net_individual_contributions> <xsl:value-of select="net_individual_contributions"/> </nyt:net_individual_contributions> <nyt:net_party_contributions> <xsl:value-of select="net_party_contributions"/> </nyt:net_party_contributions> <nyt:net_pac_contributions> <xsl:value-of select="net_pac_contributions"/> </nyt:net_pac_contributions> <nyt:net_candidate_contributions> <xsl:value-of select="net_candidate_contributions"/> </nyt:net_candidate_contributions> <nyt:federal_funds><xsl:value-of select="federal_funds"/></nyt:federal_funds> <nyt:total_contributions_less_than_200> <xsl:value-of select="total_contributions_less_than_200"/> </nyt:total_contributions_less_than_200> <nyt:total_contributions_2300> <xsl:value-of select="total_contributions_2300"/> </nyt:total_contributions_2300> <nyt:net_primary_contributions> <xsl:value-of select="net_primary_contributions"/> </nyt:net_primary_contributions> <nyt:net_general_contributions> <xsl:value-of select="net_general_contributions"/> </nyt:net_general_contributions> <nyt:total_refunds><xsl:value-of select="total_refunds"/></nyt:total_refunds> <nyt:date_coverage_from rdf:datatype="date"> <xsl:value-of select="date_coverage_from"/> </nyt:date_coverage_from> <nyt:date_coverage_to rdf:datatype="date"> <xsl:value-of select="date_coverage_to"/> </nyt:date_coverage_to> </rdf:Description> </xsl:template> <xsl:template match="text()|@*"/> </xsl:stylesheet>
The stylesheet uses the prefix nyt: (http://www.nytimes.com) for the predicates of the augmenting triples. This has been used purely for illustration - you may prefer to define your own ontology for RDF data derived from New York Times APIs.
Testing the Meta-Cartridge
After creating the required Virtuoso/PL functions and installing the stylesheet, you should be able to test the meta-cartridge by sponging a Freebase page as described earlier using ODE or the command line. For instance:
You should see campaign finance data added to the graph created by the Sponger in the form of triples with predicates starting http://www.nytimes.com/xxx, e.g. http://www.nytimes.com/net_primary_contribution.
How The Meta-Cartridge Works
The comments in the meta-cartridge code detail how the cartridge works. In brief:
Given the URI of the graph being created by the Freebase cartridge, RDF_MQL_RESOURCE_IS_SENATOR checks if the resource described by Freebase is a U.S. senator. Only then does it make sense to query for campaign finance data from the NYTCF data space.
To test for senators, the procedure starts by looking for two statements in the Freebase cartridge output similar to:
<rdf:Description rdf:about="http://localhost:8890/about/rdf/http://www.freebase.com/view/en/barack_obama#this"> <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person"/> <rdfs:seeAlso rdf:resource="http://en.wikipedia.org/wiki/Barack_Obama"/> ...
where the graph generated by the Sponger will be
<http://www.freebase.com/view/en/barack_obama>
To test whether a resource is a senator, RDF_MQL_RESOURCE_IS_SENATOR
Only if this is the case is the RDF_NYTCF_LOOKUP routine called to query for and return campaign finance data for the candidate. The form of the query and the resulting XML output from the Campaign Finance service were presented earlier.
tmp := sprintf_inverse (new_origin_uri, 'http://farm%s.static.flickr.com/%s/%s_%s.%s', 0); img_id := tmp[2];
request_hdr := headers[0]; response_hdr := headers[1]; host := http_request_header (request, 'Host'); tmp := split_and_decode (request_hdr[0], 0, '\0\0 '); http_method := tmp[0]; url := tmp[1]; protocol_version := substring (tmp[2], 6, 8); tmp := rtrim (response_hdr[0], '\r\n'); tmp := split_and_decode (response_hdr[0], 0, '\0\0 ');
url := sprintf('http://api.flickr.com/services/rest/?i"?? method=flickr.photos.getInfo&photo_id=%s&api_key=%s', img_id, api_key); tmp := http_get (url, hdr); if (hdr[0] not like 'HTTP/1._ 200 %') signal ('22023', trim(hdr[0], '\r\n'), 'RDFXX'); xd := xtree_doc (tmp);
DB.DBA.RDF_HTTP_URL_GET
A wrapper around http_get. Retrieves a URL using the specified HTTP method (defaults to GET). The function can handle proxies, redirects (up to fifteen) and HTTPS.
uri := sprintf ('http://musicbrainz.org/ws/1/%s/%s?type=xml&inc=%U', kind, id, inc); cnt := RDF_HTTP_URL_GET (uri, '', hdr, 'GET', 'Accept: */*'); xt := xtree_doc (cnt); xd := DB.DBA.RDF_MAPPER_XSLT (registry_get ('_rdf_mappers_path_') || 'xslt/mbz2rdf.xsl', xt, vector ('baseUri', new_origin_uri));
content := RDF_HTTP_URL_GET (rdf_url, new_origin_uri, hdr, 'GET', 'Accept: application/rdf+xml, text/rdf+n3, */*'); ret_content_type := http_request_header (hdr, 'Content-Type', null, null);
json_parse: Parses JSON content into a tree.
url := sprintf ('http://www.freebase.com/api/service/mqlread?queries=%U', qr); content := http_get (url, hdr); tree := json_parse (content); tree := get_keyword ('ROOT', tree); tree := get_keyword ('result', tree);
-- Writing N3 to a string output stream using function http(), parsing the N3 into a graph, then loading the graph into the quad store. ses := string_output (); http ('@prefix opl: <http://www.openlinksw.com/schema/attribution#> .\n', ses); http ('@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n', ses); ... DB.DBA.TTLP (ses, base, graph); DB.DBA.RDF_LOAD_RDFXML (strg, base, graph);
ses := string_output (); cnt := http_get (sprintf ('http://download.finance.yahoo.com/d/quotes.csv?s=%U&f=nsbavophg&e=.csv', symbol)); arr := rdfm_yq_parse_csv (cnt); http ('<quote stock="NASDAQ">', ses); foreach (any q in arr) do { http_value (q[0], 'company', ses); http_value (q[1], 'symbol', ses); ... } http ('</quote>', ses); content := string_output_string (ses); xt := xtree_doc (content);
content := RDF_HTTP_URL_GET (uri, '', hdr, 'GET', 'Accept: */*'); xt := xtree_doc (content);
profile := cast (xpath_eval ('/html/head/@profile', xt) as varchar);
tmp := http_get (url); xd := xtree_doc (tmp); xt := DB.DBA.RDF_MAPPER_XSLT ( registry_get ('_rdf_mappers_path_') || 'xslt/atom2rdf.xsl', xd, vector ('baseUri', coalesce (dest, graph_iri)));
xt := DB.DBA.RDF_MAPPER_XSLT ( registry_get ('_rdf_mappers_path_') || 'xslt/crunchbase2rdf.xsl', xt, vector ('baseUri', coalesce (dest, graph_iri), 'base', base, 'suffix', suffix)); xd := serialize_to_UTF8_xml (xt); DB.DBA.RM_RDF_LOAD_RDFXML (xd, new_origin_uri, coalesce (dest, graph_iri));
content := RDF_HTTP_URL_GET (uri, '', hdr, 'GET', 'Accept: */*'); xt := xtree_doc (content); xd := DB.DBA.RDF_MAPPER_XSLT ( registry_get ('_rdf_mappers_path_') || 'xslt/mbz2rdf.xsl', xt, vector ('baseUri', new_origin_uri)); xd := serialize_to_UTF8_xml (xd); DB.DBA.RM_RDF_LOAD_RDFXML (xd, new_origin_uri, coalesce (dest, graph_iri));
sess := string_output (); ... http (sprintf ('<http://dbpedia.org/resource/%s> <http://xbrlontology.com/ontology/finance/stock_market#hasCompetitor> <http://dbpedia.org/resource/%s> .\n', symbol, x), sess); http (sprintf ('<http://dbpedia.org/resource/%s> <http://www.w3.org/2000/01/rdf-schema#isDefinedBy> <http://finance.yahoo.com/q?s=%s> .\n', x, x), sess); content := string_output_string (sess); DB.DBA.TTLP (content, new_origin_uri, coalesce (dest, graph_iri));
dbg_obj_print ('try all grddl mappings here');
PingtheSemanticWeb (PTSW) is a repository for RDF documents. The PTSW web service archives the location of recently created or updated RDF documents on the Web. It is intended for use by crawlers or other types of software agents which need to know when and where the latest updated RDF documents can be found. They can request a list of recently updated documents as a starting location to crawl the Semantic Web.
You may find this service useful for publicizing your own RDF content. Content authors can notify PTSW that an RDF document has been created or updated by pinging the service with the URL of the document. The Sponger supports this facility through the async_queue and ping_service parameters of the cartridge hook function, where the ping_service parameter contains the ping service URL as configured in the SPARQL section of the virtuoso.ini file:
[SPARQL] ... PingService = http://rpc.pingthesemanticweb.com/ ...
The configured ping service can be called using an asynchronous request and the RDF_SW_PING procedure as illustrated below.
create procedure DB.DBA.RDF_LOAD_HTML_RESPONSE ( in graph_iri varchar, in new_origin_uri varchar, in dest varchar, inout ret_body any, inout async_queue any, inout ping_service any, inout _key any, inout opts any ) { ... if ( ... and async_queue is not null) aq_request (async_queue, 'DB.DBA.RDF_SW_PING', vector (ping_service, new_origin_uri));
For more details refer to section Asynchronous Execution and Multithreading in Virtuoso/PL
A list of the main namespaces / ontologies used by OpenLink-provided Sponger cartridges is given below. Some of these ontologies may prove useful when creating your own cartridges.
Snapshots of the Freebase cartridge and stylesheet compatible with the meta-cartridge example presented earlier in this document can be found below.
DB.DBA.RDF_LOAD_MQL:
--no_c_escapes- create procedure DB.DBA.RDF_LOAD_MQL (in graph_iri varchar, in new_origin_uri varchar, in dest varchar, inout _ret_body any, inout aq any, inout ps any, inout _key any, inout opts any) { declare qr, path, hdr any; declare tree, xt, xd, types any; declare k, cnt, url, sa varchar; hdr := null; sa := ''; declare exit handler for sqlstate '*' { --dbg_printf ('%s', __SQL_MESSAGE); return 0; }; path := split_and_decode (new_origin_uri, 0, '%\0/'); if (length (path) < 1) return 0; k := path [length(path) - 1]; if (path [length(path) - 2] = 'guid') k := sprintf ('"id":"/guid/%s"', k); else { if (k like '#%') k := sprintf ('"id":"%s"', k); else { sa := DB.DBA.RDF_MQL_GET_WIKI_URI (k); k := sprintf ('"key":"%s"', k); } } qr := sprintf ('{"ROOT":{"query":[{%s, "type":[]}]}}', k); url := sprintf ('http://www.freebase.com/api/service/mqlread?queries=%U', qr); cnt := http_get (url, hdr); tree := json_parse (cnt); xt := get_keyword ('ROOT', tree); if (not isarray (xt)) return 0; xt := get_keyword ('result', xt); types := vector (); foreach (any tp in xt) do { declare tmp any; tmp := get_keyword ('type', tp); types := vector_concat (types, tmp); } --types := get_keyword ('type', xt); DELETE FROM DB.DBA.RDF_QUAD WHERE g = iri_to_id(new_origin_uri); foreach (any tp in types) do { qr := sprintf ('{"ROOT":{"query":{%s, "type":"%s", "*":[]}}}', k, tp); url := sprintf ('http://www.freebase.com/api/service/mqlread?queries=%U', qr); cnt := http_get (url, hdr); --dbg_printf ('%s', cnt); tree := json_parse (cnt); xt := get_keyword ('ROOT', tree); xt := DB.DBA.MQL_TREE_TO_XML (tree); --dbg_obj_print (xt); xt := DB.DBA.RDF_MAPPER_XSLT (registry_get ('_rdf_mappers_path_') || 'xslt/mql2rdf.xsl', xt, vector ('baseUri', coalesce (dest, graph_iri), 'wpUri', sa)); sa := ''; xd := serialize_to_UTF8_xml (xt); -- dbg_printf ('%s', xd); DB.DBA.RM_RDF_LOAD_RDFXML (xd, new_origin_uri, coalesce (dest, graph_iri)); } return 1; }
mql2rdf.xsl:
<?xml version="1.0" encoding="UTF-8"?> <!-- - - $Id: rdfandsparql.xml,v 1.95.2.31 2010/03/30 17:59:29 source Exp $ - - This file is part of the OpenLink Software Virtuoso Open-Source (VOS) - project. - - Copyright (C) 1998-2008 OpenLink Software - - This project is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; only version 2 of the License, dated June 1991. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA --> <!DOCTYPE xsl:stylesheet [ <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <!ENTITY bibo "http://purl.org/ontology/bibo/"> <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#"> <!ENTITY foaf "http://xmlns.com/foaf/0.1/"> <!ENTITY sioc "http://rdfs.org/sioc/ns#"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vi="http://www.openlinksw.com/virtuoso/xslt/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:sioc="" xmlns:bibo="" xmlns:foaf="" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:dcterms= "http://purl.org/dc/terms/" xmlns:mql="http://www.freebase.com/"> <xsl:output method="xml" indent="yes" /> <xsl:param name="baseUri" /> <xsl:param name="wpUri" /> <xsl:variable name="ns">http://www.freebase.com/</xsl:variable> <xsl:template match="/"> <rdf:RDF> <xsl:if test="/results/ROOT/result/*"> <rdf:Description rdf:about="{$baseUri}"> <rdf:type rdf:resource="Document"/> <rdf:type rdf:resource="Document"/> <rdf:type rdf:resource="Container"/> <sioc:container_of rdf:resource="{vi:proxyIRI($baseUri)}"/> <foaf:primaryTopic rdf:resource="{vi:proxyIRI($baseUri)}"/> <dcterms:subject rdf:resource="{vi:proxyIRI($baseUri)}"/> </rdf:Description> <rdf:Description rdf:about="{vi:proxyIRI($baseUri)}"> <rdf:type rdf:resource="Item"/> <sioc:has_container rdf:resource="{$baseUri}"/> <xsl:apply-templates select="/results/ROOT/result/*"/> <xsl:if test="$wpUri != ''"> <rdfs:seeAlso rdf:resource="{$wpUri}"/> </xsl:if> </rdf:Description> </xsl:if> </rdf:RDF> </xsl:template> <xsl:template match="*[starts-with(.,'http://') or starts-with(.,'urn:')]"> <xsl:element namespace="{$ns}" name="{name()}"> <xsl:attribute name="rdf:resource"> <xsl:value-of select="vi:proxyIRI (.)"/> </xsl:attribute> </xsl:element> </xsl:template> <xsl:template match="*[starts-with(.,'/')]"> <xsl:if test="local-name () = 'type' and . like '%/person'"> <rdf:type rdf:resource="Person"/> </xsl:if> <xsl:if test="local-name () = 'type'"> <sioc:topic> <skos:Concept rdf:about="{vi:proxyIRI (concat ($ns, 'view', .))}"/> </sioc:topic> </xsl:if> <xsl:element namespace="{$ns}" name="{name()}"> <xsl:attribute name="rdf:resource"> <xsl:value-of select="vi:proxyIRI(concat ($ns, 'view', .))"/> </xsl:attribute> </xsl:element> </xsl:template> <xsl:template match="*[* and ../../*]"> <xsl:element namespace="{$ns}" name="{name()}"> <xsl:attribute name="rdf:parseType">Resource</xsl:attribute> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="*"> <xsl:if test="* or . != ''"> <xsl:choose> <xsl:when test="name()='image'"> <foaf:depiction rdf:resource="{vi:mql-image-by-name (.)}"/> </xsl:when> <xsl:otherwise> <xsl:element namespace="{$ns}" name="{name()}"> <xsl:if test="name() like 'date_%'"> <xsl:attribute name="rdf:datatype">dateTime</xsl:attribute> </xsl:if> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> </xsl:stylesheet>
This section contains examples of Web resources which can be transformed by RDF Cartridges. It also states where additional setup for given cartridges is needed i.e. keys account names etc.
Service based:
needs: api key example: http://www.amazon.com/gp/product/0553383043
needs: account, api-key example: http://cgi.ebay.com/RARE-DAY-IN-FAIRY-LAND-ELEPHANT-FOLIO-20-FULL-COLOR_W0QQitemZ140209597189QQihZ004QQcategoryZ29223QQssPageNameZWDVWQQrdZ1QQcmdZViewItem
example: http://musicbrainz.org/release/37e955d4-a53c-45aa-a812-1b23b88dbc13.html
example: http://www.freebase.com/view/en/beta_ursae_majoris
needs: api-key, secret, persistent-session-id example: http://www.facebook.com/profile.php?id=841100003
example: http://finance.yahoo.com/q?s=AAPL
example: http://local.yahooapis.com/MapsService/V1/trafficData?appid=YahooDemo&street=701+First+Street&city=Sunnyvale&state=CA
example: https://bugzilla.mozilla.org/show_bug.cgi?id=251714
needs: unzip plugin
needs: php plugin & dbpedia extractor example: http://wikipedia.org/wiki/London
GRDDL
example: http://www.google.com/base/feeds/snippets/17891817243016304554
URN handlers
example: urn:lsid:ubio.org:namebank:12292
needs: hslookup plugin, relevant html, pdf, xml etc. mappers enabled example: doi:10.1038/35057062
example: oai:dcmi.ischool.washington.edu:article/8
The Virtuoso SPARQL engine (called for brevity just SPARQL bellow) supports IRI Dereferencing, however it understands only RDF data, that is it can retrieve only files containing RDF/XML, turtle or N3 serialized RDF data, if format is unknown it will try mapping with built-in WebDAV metadata extractor. In order to extend this feature with dereferencing web or file resources which naturally don't have RDF data (like PDF, JPEG files for example) is provided a special mechanism in SPARQL engine. This mechanism is called RDF mappers for translation of non-RDF data files to RDF.
In order to instruct the SPARQL to call a RDF mapper it needs to be registered and it will be called for a given URL or MIME type pattern. In other words, when unknown for SPARQL format is received during URL dereferencing process, it will look into a special registry (a table) to match either the MIME type or IRI using a regular expression, if match is found the mapper function will be called.
Sponger functionality is also exposed via Virtuoso's "/proxy/rdf/" endpoint, as an in-built REST style Web service available in any Virtuoso standard installation. This web service takes a target URL and either returns the content "as is" or tries to transform (by sponging) to RDF. Thus, the proxy service can be used as a 'pipe' for RDF browsers to browse non-RDF sources.
For more information see RDF Sponger Proxy service
To clear cache on all values of HS_LOCAL_IRI of the SYS_HTTP_SPONGE table use: SPARQL clear graph <A-Named-Graph>;
Requires Virtuoso 6.0 TP1 or higher for use.
If you have an existing Virtuoso 6.x installation, and your Quad Store has greater than 10K worth of triples, please perform the following steps:
drop index RDF_QUAD_OPGS; drop index RDF_QUAD_POGS; drop index RDF_QUAD_GPOS; drop index RDF_QUAD_OGPS; checkpoint; create table R2 (G iri_id_8, S iri_id_8, P iri_id_8, O any, primary key (S, P, O, G)); alter index R2 on R2 partition (S int (0hexffff00)); log_enable (2); INSERT INTO R2 (G, S, P, O) select G, S, P, O FROM rdf_quad; DROP TABLE RDF_QUAD; ALTER TABLE r2 rename RDF_QUAD; checkpoint; create bitmap index RDF_QUAD_OPGS on RDF_QUAD (O, P, G, S) partition (O varchar (-1, 0hexffff)); create bitmap index RDF_QUAD_POGS on RDF_QUAD (P, O, G, S) partition (O varchar (-1, 0hexffff)); create bitmap index RDF_QUAD_GPOS on RDF_QUAD (G, P, O, S) partition (O varchar (-1, 0hexffff)); checkpoint;
Note this step may take sometime depending on how many triples are already in your Quad Store.
![]() |
Figure: 14.6.1.5.3.1. Install the FCT package |
grant SELECT on DB.DBA.RDF_QUAD to "SPARQL";
![]() |
Figure: 14.6.1.5.3.1. Install the RDF Mappers package |
![]() |
Figure: 14.6.1.5.3.1. FCT HTML interface |
RDF_OBJ_FT_RULE_ADD (null, null, 'All'); VT_INC_INDEX_DB_DBA_RDF_OBJ ();
urilbl_ac_init_db()
s_rank()
http://cname/about/html/http/news.cnet.com
![]() |
Figure: 14.6.1.5.4.1. Sponge data |
![]() |
Figure: 14.6.1.5.4.1. Facet Browser Search |
![]() |
Figure: 14.6.1.5.4.1. Facet Browser Search Results |
![]() |
Figure: 14.6.1.5.4.1. Results of the classes/properties |
![]() |
Figure: 14.6.1.5.4.1. Exclude Type(s) |
![]() |
Figure: 14.6.1.5.4.1. Results of Excluded Type(s) |
$ more cnet.xml <?xml version="1.0"?> <query xmlns="http://openlinksw.com/services/facets/1.0" inference="" same-as=""> <text>CNET</text> <view type="text" limit="20" offset=""/> </query> $ curl -H "Content-Type: text/xml" -d @cnet.xml http://cname/fct/service <fct:facets xmlns:fct="http://openlinksw.com/services/facets/1.0/"> <fct:sparql> SELECT ?s1 as ?c1, (bif:search_excerpt (bif:vector ('CNET'), ?o1)) as ?c2, ?sc, ?rank WHERE {{{ SELECT ?s1, (?sc * 3e-1) as ?sc, ?o1, (sql:rnk_scale (<LONG::IRI_RANK> (?s1))) as ?rank WHERE { ?s1 ?s1textp ?o1 . ?o1 bif:contains '"CNET"' option (score ?sc) . } ORDER BY DESC (?sc * 3e-1 + sql:rnk_scale (<LONG::IRI_RANK> (?s1))) LIMIT 20 OFFSET 0 }}}</fct:sparql> <fct:time>16</fct:time> <fct:complete>yes</fct:complete> <fct:timeout>0</fct:timeout> <fct:db-activity> 131R rnd 36R seq 0P disk 0B / 0 messages</fct:db-activity> <fct:result type="text"> <fct:row> <fct:column datatype="trank">4.5</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.com">http://news.com</fct:column> <fct:column>Technology News - CNET News</fct:column> <fct:column><span class="srch_xerpt"><b>CNET</b> News.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">4.5</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.cnet.com/2547-1_3-0-20.xml">http://news.cnet.com/2547-1_3-0-20.xml</fct:column> <fct:column>CNET News.com</fct:column> <fct:column><span class="srch_xerpt"><b>CNET</b> News.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">4.5</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.cnet.com">http://news.cnet.com</fct:column> <fct:column>Technology News - CNET News</fct:column> <fct:column><span class="srch_xerpt"><b>CNET</b> News.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3.9</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.com">http://news.com</fct:column> <fct:column>Technology News - CNET News</fct:column> <fct:column><span class="srch_xerpt">Technology News <b>CNET</b> News.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3.9</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.cnet.com">http://news.cnet.com</fct:column> <fct:column>Technology News - CNET News</fct:column> <fct:column><span class="srch_xerpt">Technology News <b>CNET</b> News.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.com">http://news.com</fct:column> <fct:column>Technology News - CNET News</fct:column> <fct:column><span class="srch_xerpt">Tech news and business reports by <b>CNET</b> News.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.cnet.com/2547-1_3-0-20.xml">http://news.cnet.com/2547-1_3-0-20.xml</fct:column> <fct:column>CNET News.com</fct:column> <fct:column><span class="srch_xerpt">Tech news and business reports by <b>CNET</b> News.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.cnet.com">http://news.cnet.com</fct:column> <fct:column>Technology News - CNET News</fct:column> <fct:column><span class="srch_xerpt">Tech news and business reports by <b>CNET</b> News.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.com#6">http://news.com#6</fct:column> <fct:column>There's an electric car in your future</fct:column> <fct:column><span class="srch_xerpt">... <b>CNET</b> Car Tech posts photos of electric cars expected to come out by 2011.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.cnet.com/2547-1_3-0-20.xml#9">http://news.cnet.com/2547-1_3-0-20.xml#9</fct:column> <fct:column>There's an electric car in your future</fct:column> <fct:column><span class="srch_xerpt">... <b>CNET</b> Car Tech posts photos of electric cars expected to come out by 2011.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.cnet.com#9">http://news.cnet.com#9</fct:column> <fct:column>There's an electric car in your future</fct:column> <fct:column><span class="srch_xerpt">... <b>CNET</b> Car Tech posts photos of electric cars expected to come out by 2011.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.com#6">http://news.com#6</fct:column> <fct:column>There's an electric car in your future</fct:column> <fct:column><span class="srch_xerpt">... <b>CNET</b> Car Tech posts photos of electric cars expected to come out by 2011.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.cnet.com/2547-1_3-0-20.xml#9">http://news.cnet.com/2547-1_3-0-20.xml#9</fct:column> <fct:column>There's an electric car in your future</fct:column> <fct:column><span class="srch_xerpt">... <b>CNET</b> Car Tech posts photos of electric cars expected to come out by 2011.</span></fct:column> </fct:row> <fct:row> <fct:column datatype="trank">3</fct:column> <fct:column datatype="erank">5.881291583872905e-014</fct:column> <fct:column datatype="url" shortform="http://news.cnet.com#9">http://news.cnet.com#9</fct:column> <fct:column>There's an electric car in your future</fct:column> <fct:column><span class="srch_xerpt">... <b>CNET</b> Car Tech posts photos of electric cars expected to come out by 2011.</span></fct:column> </fct:row> </fct:result> </fct:facets>
![]() |
Figure: 14.6.1.5.4.1. Query Facet Browser Web service endpoint |
![]() |
Figure: 14.6.1.5.4.1. Select a URI from the list of available Labels |
![]() |
Figure: 14.6.1.5.4.1. Enter URI |
![]() |
Figure: 14.6.1.5.4.1. Obtain a description of the URI |
VT_INC_INDEX_DB_DBA_RDF_OBJ ()
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
dbpedia-owl:Artist
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
Displaying types of e1 where: e1 has any property whose value contains "Michael Jackson". e1 is a dbpedia-owl:Artist . Drop
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
Displaying values and text summaries associated with pattern e1 where: e1 has any property whose value contains "Michael Jackson". e1 is a dbpedia-owl:Artist . Drop
dbpedia:Michael_Jackson
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
SPARQL SELECT ?g count (*) where { graph ?g { <URI> ?p ?o } } group by ?g order by desc 2 limit 20
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
SPARQL SELECT ?g count (*) where { graph ?g { ?s ?p <URI> } } group by ?g order by desc 2 limit 20
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
SPARQL SELECT ?syn ( sql:rnk_scale (<LONG::IRI_RANK> (?syn))) where { { SELECT ?s ?syn where { {?syn owl:sameAs ?s } union {?s owl:sameAs ?syn} } } option (transitive, t_distinct, t_min (0), T_in (?s), t_out (?syn)) . filter (!isliteral (?syn) && ?s = <URI> ) } order by desc 2 limit 20
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
SPARQL SELECT distinct ?syn ?p ?o (sql:rnk_scale (<LONG::IRI_RANK> (?syn))) where { <URI> ?p ?o . filter (0 != (<LONG::bif:rdf_is_sub> ("b3sifp", ?p, lod:ifp_like, 3))) . ?syn ?p ?o . } order by desc 4 limit 20
![]() |
Figure: 14.6.1.5.5.1. Usage Statistics |
Example for Use Faceted Navigation to Explore Virtuoso hosted Linked Data
The following example demonstrates a simple scenario of tracking Kingsley Idehen's conversations $ across the Web, using the Virtuoso Faceted Browser hosted on URIBurner.
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.2. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.2. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
![]() |
Figure: 14.6.1.5.6.1. Faceted Navigation Example |
The Virtuoso Facets web service is a general purpose RDF query facility for facet based browsing. It takes an XML description of the view desired and generates the reply as an XML tree containing the requested data. The user agent or a local web page can use XSLT for rendering this for the end user. The selection of facets and values is represented as an XML tree. The rationale for this is the fact that such a representation is easier to process in an application than the SPARQL source text or a parse tree of SPARQL and more compactly captures the specific subset of SPARQL needed for faceted browsing. The web service returns the SPARQL source text also, thus this can serve as a basis for and-crafted queries.
The top element of the tree is <query>, it must be in namespace "http://openlinksw.com/services/facets/1.0/".
This has the following attributes:
The result is a tree of the form:
<facets xmlns="http://openlinksw.com/services/facets/1.0/"> <result><row><column datatype="..." shortform="..." xml:lang="..">...</column></row></result> <time>msecs</time> <complete>yes or no</complete> <db-activity>resource use string</db-activity> <sparql>sparql statement text</sparql> </facets>
By convention, the first column is the subject selected by the view element, typically a URI, the second a label of the URI and the third, if present, is either a count or a search summary.
The first column's text child is the text form of the value. The column element has the following attributes qualifying this further:
The query has the top level element <query>. The child elements of this represent conditions pertaining to a single subject. A join is expressed with the property or property-of element. This has in turn children which state conditions on a property of the first subject. property and property-of elements can be nested to an arbitrary depth and many can occur inside one containing element. In this way, tree-shaped structures of joins can be expressed.
Expressing more complex relationships, such as intermediate grouping, subqueries, arithmetic or such requires writing the query in SPARQL. The XML format is a shorthand for easy automatic composition of queries needed for showing facets, not a replacement for SPARQL.
A facet query contains a single view element. This specifies which subject of the joined subjects is shown. Its attributes specify the manner of viewing, e.g. list of distinct values, distinct values with occurrence counts, properties or classes of the selected subjects etc.
The top query element or any property or property-of element can have the following types of children:
<text property="iri">text pattern</text>
The subject has an O that matches the text pattern. If property is given, the text pattern must occur in a value of this property. If not specified, any property will do. The value "none" for property is the same as not specifying a property. This is restricted to occurring directly under the top level query element.
<class iri="iri" inference="ctx_name" />
The S must be an instance of this class. If inference is specified then option (input:inference "ctx_name" is added and applies to this pattern alone.
<property iri="iri" same_as="yes" inference="ctx_name">
The child elements of this are conditions that apply to the value of this property of the S that is in scope in the enclosing <query> or <property> element. If same_as is present, then option (input:same-as "yes") is added to the triple pattern which specifies this property. If inference is present, then option (input:inference "ctx_name") is added to the triple pattern for the property.
<property-of iri="iri" same_as="yes" inference="ctx_name" >
The child elements of this are conditions that apply to an S which has property "iri" whose object is the S in scope in the enclosing <query> or <property> element. The options are otherwise the same as with property.
<value datatype="type" xml:lang="lng" op="= | < | > | >= | <=">value </value>
When this occurs inside <property> or <property-of> this means that the property in scope has the specified relation to the value. type and language can be used for XML typed or language tagged literals. The "uri" type means that the value is a qualified name of a URI. If this occurs directly under the <query> element, this means that the query starts with a fixed subject. If this is so, then there must be property or propertyof elements or the view element must specify properties or classes, list is not allowed as a view type. This is so because the query must have at least one triple pattern.
<view type="view" limit="n" offset="n" >
This may occur once inside a <query> element but may occur either at top level or inside property or property-of elements. This specifies what which subject is presented in the result set.
The type can be:
SPARQL SELECT ?p count (*) { ?this_s ?p ?any_o ...} GROUP BY ?p ORDER BY DESC 2 LIMIT l OFFSET 0
SPARQL SELECT ?p count (*) { ?any_s ?p ?this_s ... } GROUP BY ?p ORDER BY DESC 2 LIMIT L OFFSET 0
SPARQL SELECT ?c count (*) WHERE { ?xx a ?c ... } GROUP BY ?c ORDER BY DESC 2 LIMIT l OFFSET 0
SPARQL SELECT DISTINCT ?s (bif:search_excerpt (sql:search_terms (""pattern"), ?o)) ... LIMIT l OFFSET 0
SPARQL SELECT DISTINCT ?s long::sql:fct_label (?s) ... LIMIT l OFFSET 0
SPARQL SELECT ?s COUNT (*) .... GROUP BY ?s ORDER BY DESC 2
SPARQL SELECT (sql:subseq (?s, 0, 1)) count (*) ... GROUP BY (sql:subseq (?s, 0, 1)) ORDER BY 1
SPARQL SELECT DISTINCT ?lat ?long ?s WHERE ?s geo:lat ?lat . ?s geo:long ?long . ... }
SPARQL SELECT sql::year (?s) count (*) ... GROUP BY (bif:year (?s)) ORDER BY 1 OFFSET 0 LIMIT l
SPARQL SELECT sql::round_month (?s) count (*) ... GROUP BY (sql:round_month (?s)) ORDER BY 1 OFFSET 0 LIMIT l
SPARQL SELECT sql::round_week (?s) COUNT (*) ... GROUP BY (sql:round_week (?s)) ORDER BY 1 OFFSET 0 LIMIT l
SPARQL describe ?s ... OFFSET 0 LIMIT l
The following types of customization will be generally useful:
The source code is divided in two SQL files and a number of XSLT sheets. The file facet.sql has the code for the web service. The facet_view.sql file contains the procedures for the sample HTML interface.
Note: in all examples the default namespace xmlns="http://openlinksw.com/services/facets/1.0/" is omitted for brevity.
For people called Mike:
<query> <text>Mike</text> <view type="text"/> </query>
To open the list of people who Mike knows:
<query> <text>Mike</text> <view type="properties"/> </query>
To show the list of subjects Mike knows:
<query> <text>Mike</text> <property iri="foaf:knows> <view type="list" /> </property> </query>
To show the properties of people Mike knows:
<query> <text>Mike</text> <property iri="foaf:knows> <view type="properties" /> </property> </query>
To show the names:
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <view type="list" /> </property> </property> </query>
To specify one named Joe:
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> <view type="properties" /> </property> </query>
This lists the properties of the friends of Mike that are called Joe.
To show the Mikes that know a Joe, one would change the shown variable in the navigation and get:
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> </property> <view type="text" /> </query>
This would be the search summaries of subjects with Mike in some field that know a subject with name Joe.
Now to specify that Mike must be a member of a discussion board:
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> </property> <view type="property-in" /> </query>
This lists the properties of triples whom object is Mike. Pick sioc:member_of
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> </property> <property-of iri="sioc:member_of> <view type="list" /> </property-of> </query>
This would show things where Mike is a member. To specify that the thing must be a forum:
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> </property> <property-of iri="sioc:member_of> <view type="classes" /> </property-of> </query>
This shows classes of things where Mike is a member Clicking on sioc:Forum gives:
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> </property> <property-of iri="sioc:member_of> <class iri="sioc:Forum" /> <view type="classes"/> </property-of> </query>
The view stays with classes, but now scoped to the classes of things where Mike is a member that are instances of sioc:Forum.
To go look at the list of Mikes with the added restriction, click the shown variable in the navigation and set it to s1.
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> </property> <property-of iri="sioc:member_of> <class iri="sioc:Forum" /> </property-of> <view type="list"/> </query>
To say that Joe must also have a geekCode, One clicks the shown variable and sets it to s2 and the view to properties.
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> <view type="properties"/> </property> <property-of iri="sioc:member_of> <class iri="sioc:Forum" /> </property-of> </query>
Pick geekCode
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> <property iri="geekCode"> <view type="list"/> </property> </property> <property-of iri="sioc:member_of> <class iri="sioc:Forum" /> </property-of> </query>
We specify no restriction on the geekCode. Click the shown variable to take the focus back to Mike.
<query> <text>Mike</text> <property iri="foaf:knows> <property iri="foaf:name> <value>Joe</value> </property> <property iri="geekCode"></property> </property> <property-of iri="sioc:member_of> <class iri="sioc:Forum" /> </property-of> <view type="text"/> </query>
The Virtuoso Facets web service provide following REST interface:
Service description:
Error conditions:
The all error conditions are reported via 'Error explanation'
Files:
The facet_svc.sql contains web service code and virtual directory mapping, and it uses fct_req.xsl & fct_resp.xsl as request & response filters.
Example:
Using CURL program
curl -H "Content-Type: text/xml" -d @post.xml http://lod.openlinksw.com/fct/service
Where 'post.xml' document contains query document:
<?xml version="1.0"?> <query xmlns="http://openlinksw.com/services/facets/1.0" inference="" same-as=""> <text> Seattle Mariners traveled all the way to Japan to watch</text> <view type="text" limit="20" offset=""/> </query>
Produces following response:
<fct:facets xmlns:fct="http://openlinksw.com/services/facets/1.0/"> <fct:sparql> SELECT distinct ?s1 as ?c1, (bif:search_excerpt (bif:vector ('THE', 'MARINERS', 'WAY', 'SEATTLE', 'WATCH', 'ALL', 'TO', 'JAPAN', 'TRAVELED'), ?o1)) as ?c2 WHERE { ?s1 ?s1textp ?o1 . FILTER (bif:contains (?o1, '(THE AND MARINERS AND WAY AND SEATTLE AND WATCH AND ALL AND TO AND JAPAN AND TRAVELED)')) . } LIMIT 20 OFFSET 0 </fct:sparql> <fct:time>116</fct:time> <fct:complete>yes</fct:complete> <fct:db-activity> 134R rnd 9.488KR seq 0P disk 8.966MB / 602 messages</fct:db-activity> <fct:result> <fct:row> <fct:column datatype="url" shortform="http://bobdupuy.mlbl...ld_baseball__6.html">http://bobdupuy.mlblogs.com/bobdupuy/2006/03/world_baseball__6.html></fct:column> <fct:column /> <fct:column><span class="srch_xerpt">... While Chuck Armstrong president of <b>the</b> <b>Seattle</b> <b>Mariners</b> <b>traveled</b> <b>all</b> <b>the</b> <b>way</b> <b>to</b> <b>Japan</b> <b>to</b> <b>watch</b> Ichiro... for <b>the</b> advancing <b>Japan</b> team last week <b>the</b> star from <b>the</b> <b>Seattle</b> roster so far in Round 1 has without a doubt... leading <b>the</b> Dominican <b>to</b> its...</span></fct:column> </fct:row> <fct:row> <fct:column datatype="url" shortform="http://bobdupuy.mlbl...ld_baseball__6.html">http://bobdupuy.mlblogs.com/bobdupuy/2006/03/world_baseball__6.html></fct:column> <fct:column /> <fct:column><span class="srch_xerpt">Orlando While Chuck Armstrong president of <b>the</b> <b>Seattle</b> <b>Mariners</b> <b>traveled</b> <b>all</b> <b>the</b> <b>way</b> <b>to</b> <b>Japan</b> <b>to</b> <b>watch</b>... perform for <b>the</b> advancing <b>Japan</b> team last week <b>the</b> star from <b>the</b> <b>Seattle</b> roster so far in Round 1 has without...</span></fct:column> </fct:row> </fct:result> </fct:facets>
The Virtuoso APIs for FCT REST services are Virtuoso Stored Procedures that enable faceted browsing over Linked Data hosted in the RDF Quad Store. This also includes Linked Data that is progressively added to the Quad Store via URI de-referencing.
They enable the use Virtuoso's VSP/VSPX technology to produce (X)HTML-based Linked Data explorer pages that are endowed with high-performance (in-process) faceted browsing capability.
You can use this API with Virtuoso SQL calls that provide data to your VSP/VSPX, ASP.NET, PHP, etc., -based interfaces using ODBC, JDBC, ADO.NET, or XMLA connectivity (SPASQL) to Virtuoso.
API DefinitionCREATE PROCEDURE fct_exec ( IN tree ANY , IN timeout INT ) { DECLARE start_time, view3, inx, n_rows INT ; DECLARE sqls, msg, qr, qr2, act, query VARCHAR ; DECLARE md, res, results, more ANY ; DECLARE tmp ANY ; DECLARE offs, lim INT ; SET result_timeout = _min ( timeout, ATOI ( registry_get ('fct_timeout_max') ) ) ; offs := xpath_eval ('//query/view/@offset', tree); lim := xpath_eval ('//query/view/@limit', tree); -- db_activity (); results := vector (null, null, null); more := vector (); IF ( xpath_eval ( '//query[@view3="yes"]//view[@type="text"]', tree ) IS NOT NULL ) { more := VECTOR ('classes', 'properties'); } sqls := '00000'; qr := fct_query ( xpath_eval ('//query', tree, 1) ) ; query := qr; -- dbg_obj_print (qr); qr2 := fct_xml_wrap (tree, qr); start_time := msec_time (); dbg_printf('query: %s', qr2); EXEC ( qr2, sqls, msg, vector (), 0, md, res ) ; n_rows := row_count (); act := db_activity (); SET result_timeout = 0; IF ( sqls <> '00000' AND sqls <> 'S1TAT' ) SIGNAL (sqls, msg); IF ( NOT ISARRAY (res) OR 0 = length (res) OR NOT ISARRAY (res[0]) OR 0 = length (res[0]) ) results[0] := xtree_doc ('<result/>'); ELSE results[0] := res[0][0]; inx := 1; FOREACH (VARCHAR tp IN more) DO { tree := XMLUpdate ( tree, '/query/view/@type', tp, '/query/view/@limit', '40', '/query/view/@offset', '0' ) ; qr := fct_query (xpath_eval ('//query', tree, 1)); qr2 := fct_xml_wrap (tree, qr); sqls := '00000'; SET result_timeout = _min ( timeout, ATOI ( registry_get ('fct_timeout_max') ) ) ; EXEC ( qr2, sqls, msg, vector (), 0, md, res ); n_rows := row_count (); act := db_activity (); SET result_timeout = 0; IF ( sqls <> '00000' AND sqls <> 'S1TAT' ) SIGNAL (sqls, msg); IF ( ISARRAY (res) AND LENGTH (res) AND ISARRAY (res[0]) AND LENGTH (res[0]) ) { tmp := res[0][0]; tmp := XMLUpdate (tmp, '/result/@type', tp); results[inx] := tmp; } inx := inx + 1; } res := XMLELEMENT ( "facets", XMLELEMENT ( "sparql", query ), XMLELEMENT ( "time", msec_time () - start_time ), XMLELEMENT ( "complete", CASE WHEN sqls = 'S1TAT' THEN 'no' ELSE 'yes' END ), XMLELEMENT ( "timeout", _min ( timeout * 2, ATOI ( registry_get ( 'fct_timeout_max' ) ) ) ), XMLELEMENT ("db-activity", act), XMLELEMENT ("processed", n_rows), XMLELEMENT ( "view", XMLATTRIBUTES ( offs AS "offset", lim AS "limit" ) ), results[0], results[1], results[2] ); ---- for debugging: --string_to_file ('ret.xml', serialize_to_UTF8_xml (res), -2); -- dbg_obj_print (res); RETURN res; } ;
The following example shows how to use the fct_exec APi in vsp page to perform a "text" search for the word "Mike" assuming this exists in your Virtuoso RDF store (if not amend the query in the fct_example.vsp code sample below to search for text known to exist).
<?vsp declare txt, reply, tree any; declare timeout int; tree := xtree_doc (' <query> <text>Mike</text> <view type="text"/> </query> '); timeout := 3000; reply := fct_exec (tree, timeout); txt := string_output (); http_value (xslt ('virt://WS.WS.SYS_DAV_RES.RES_FULL_PATH.RES_CONTENT:/DAV/fct_example.xsl', reply, vector ()), null, txt); http (txt); ?>
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="ISO-8859-1"/> <xsl:variable name="rowcnt" select="count(/facets/result/row)"/> <xsl:template match="facets"> <div id="res"> <xsl:if test="/facets/complete = 'yes' and /facets/processed = 0 and $rowcnt = 0"> <div class="empty_result"> Nothing found. </div> </xsl:if> <xsl:for-each select="/facets/result"> <xsl:call-template name="render-result"/> </xsl:for-each> </div> <!-- #res --> </xsl:template> <xsl:template name="render-result"> <table class="result" border="1"> <thead> <tr> <th>Entity</th> <th>Title</th> <th>Text excerpt</th> </tr> </thead> <tbody> <xsl:for-each select="row"> <tr> <td class="rnk"> <xsl:for-each select="column[@datatype='trank' or @datatype='erank']"> <xsl:choose> <xsl:when test="./@datatype='trank'">Text Rank:</xsl:when> <xsl:when test="./@datatype='erank'">Entity Rank:</xsl:when> </xsl:choose> <xsl:value-of select="."/> <br/> </xsl:for-each> </td> <xsl:for-each select="column"> <xsl:choose> <xsl:when test="'url' = ./@datatype"> <td> <a> <xsl:attribute name="href">http://lod.openlinksw.com/describe/?url=<xsl:value-of select="urlify (.)"/></xsl:attribute> <xsl:attribute name="title"><xsl:value-of select="."/></xsl:attribute> <xsl:choose> <xsl:when test="'' != ./@shortform"> <xsl:value-of select="./@shortform"/> </xsl:when> <xsl:when test="'erank' = ./@datatype or 'trank' = ./@datatype">rank</xsl:when> <xsl:otherwise> <xsl:value-of select="."/> </xsl:otherwise> </xsl:choose> </a> </td> </xsl:when> <xsl:when test="'erank' = ./@datatype or 'trank' = ./@datatype"/> <xsl:when test="'srch_xerpt' = ./span/@class"> <td> <xsl:value-of select="."/> </td> </xsl:when> <xsl:otherwise/> </xsl:choose> </xsl:for-each> </tr> </xsl:for-each> </tbody> </table> </xsl:template> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
![]() |
Figure: 14.6.1.6.3.1. Facet API Example |
The facet web service is also available via SOAP protocol.
The request message contains single element 'query' with syntax explained earlier. Also the SOAPAction HTTP header should be '#query' . After successful evaluation of the query, the service will return a SOAP envelope containing in the Body element single 'facets' element described above.
Example:
This example shows execution of same command as in example for REST interface here it using SOAP:
Request message:
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP:Body> <query xmlns="http://openlinksw.com/services/facets/1.0/" inference="" same-as=""> <text>Seattle Mariners traveled all the way to Japan to watch</text> <view type="text" limit="20" offset="0"/> </query> </SOAP:Body> </SOAP:Envelope>
Response message:
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP:Body> <fct:facets xmlns:fct="http://openlinksw.com/services/facets/1.0/"> <fct:sparql>SELECT distinct ?s1 as ?c1, (bif:search_excerpt (bif:vector ('THE', 'MARINERS', 'WAY', 'SEATTLE', 'WATCH', 'ALL', 'TO', 'JAPAN', 'TRAVELED'), ?o1)) as ?c2 where { ?s1 ?s1textp ?o1 . filter (bif:contains (?o1, '(THE AND MARINERS AND WAY AND SEATTLE AND WATCH AND ALL AND TO AND JAPAN AND TRAVELED)')) . } LIMIT 20 OFFSET 0</fct:sparql> <fct:time>114</fct:time> <fct:complete>yes</fct:complete> <fct:db-activity> 134R rnd 9.488KR seq 0P disk 8.966MB / 602 messages</fct:db-activity> <fct:result> <fct:row> <fct:column datatype="url" shortform="http://bobdupuy.mlbl...ld_baseball__6.html">http://bobdupuy.mlblogs.com/bobdupuy/2006/03/world_baseball__6.html</fct:column> <fct:column/> <fct:column><span class="srch_xerpt">... While Chuck Armstrong president of <b>the</b> <b>Seattle</b> <b>Mariners</b> <b>traveled</b> <b>all</b> <b>the</b> <b>way</b> <b>to</b> <b>Japan</b> <b>to</b> <b>watch</b> Ichiro... for <b>the</b> advancing <b>Japan</b> team last week <b>the</b> star from <b>the</b> <b>Seattle</b> roster so far in Round 1 has without a doubt... leading <b>the</b> Dominican <b>to</b> its...</span></fct:column> </fct:row> <fct:row> <fct:column datatype="url" shortform="http://bobdupuy.mlbl...ld_baseball__6.html">http://bobdupuy.mlblogs.com/bobdupuy/2006/03/world_baseball__6.html</fct:column> <fct:column/> <fct:column><span class="srch_xerpt">Orlando While Chuck Armstrong president of <b>the</b> <b>Seattle</b> <b>Mariners</b> <b>traveled</b> <b>all</b> <b>the</b> <b>way</b> <b>to</b> <b>Japan</b> <b>to</b> <b>watch</b>... perform for <b>the</b> advancing <b>Japan</b> team last week <b>the</b> star from <b>the</b> <b>Seattle</b> roster so far in Round 1 has without...</span></fct:column> </fct:row> </fct:result> </fct:facets> </SOAP:Body> </SOAP:Envelope>
use DB; CREATE TABLE DB.DBA.ProductFeature ( nr integer primary key, label varchar(100) not null, comment varchar(1500) not null, publisher integer not null, publishDate date not null ) ; grant SELECT on DB.DBA.ProductFeature to public ; CREATE TABLE DB.DBA.ProductType ( nr integer primary key, label varchar(100) not null, comment varchar(1500) not null, parent integer, publisher integer not null, publishDate date not null ) ; grant SELECT on DB.DBA.ProductType to public ; CREATE TABLE DB.DBA.Producer ( nr integer primary key, label varchar(100) not null, comment varchar(1500) not null, homepage varchar(100) not null, country char(2) not null, publisher integer not null, publishDate date not null ) ; grant SELECT on DB.DBA.Producer to public ; create index producer_homepage on DB.DBA.Producer (homepage) ; CREATE TABLE DB.DBA.Product ( nr integer primary key, label varchar(100) not null, comment varchar not null, producer integer not null, propertyNum1 integer, propertyNum2 integer, propertyNum3 integer, propertyNum4 integer, propertyNum5 integer, propertyNum6 integer, propertyTex1 varchar(200), propertyTex2 varchar(200), propertyTex3 varchar(200), propertyTex4 varchar(200), propertyTex5 varchar(200), propertyTex6 varchar(200), publisher integer not null, publishDate date not null ) ; grant SELECT on DB.DBA.Product to public ; create index product_lbl on DB.DBA.Product (label) ; create unique index product_producer_nr on DB.DBA.Product (producer, nr) ; create index product_pn1 on DB.DBA.Product (propertyNum1) ; create index product_pn2 on DB.DBA.Product (propertyNum2) ; create index product_pn3 on DB.DBA.Product (propertyNum3) ; create text index on DB.DBA.Product (label) with key nr ; CREATE TABLE DB.DBA.ProductTypeProduct ( product integer not null, productType integer not null, PRIMARY KEY (product, productType) ) ; grant SELECT on DB.DBA.ProductTypeProduct to public ; create index ptype_inv on DB.DBA.ProductTypeProduct (productType, product) ; CREATE TABLE DB.DBA.ProductFeatureProduct ( product integer not null, productFeature integer not null, PRIMARY KEY (product, productFeature) ) ; grant SELECT on DB.DBA.ProductFeatureProduct to public ; create index pfeature_inv on DB.DBA.ProductFeatureProduct (productFeature, product) ; CREATE TABLE DB.DBA.Vendor ( nr integer primary key, label varchar(100) not null, comment varchar not null, homepage varchar(100) not null, country char(2) not null, publisher integer not null, publishDate date not null ) ; grant SELECT on DB.DBA.Vendor to public ; create index vendor_country on DB.DBA.Vendor (country) ; create index vendor_homepage on DB.DBA.Vendor (homepage) ; CREATE TABLE DB.DBA.Offer ( nr integer primary key, product integer not null, producer integer, vendor integer not null, price double precision not null, validFrom date not null, validTo date not null, deliveryDays integer not null, offerWebpage varchar(100) not null, publisher integer not null, publishDate date not null ) ; grant SELECT on DB.DBA.Offer to public ; create index offer_product on DB.DBA.Offer (product, deliveryDays) ; create unique index offer_producer_product on DB.DBA.Offer (producer, product, nr) ; create index offer_validto on DB.DBA.Offer (validTo) ; create index offer_vendor_product on DB.DBA.Offer (vendor, product) ; create index offer_webpage on DB.DBA.Offer (offerWebpage) ; CREATE TABLE DB.DBA.Person ( nr integer primary key, name varchar(30) not null, mbox_sha1sum char(40) not null, country char(2) not null, publisher integer not null, publishDate date not null ) ; grant SELECT on DB.DBA.Person to public ; CREATE TABLE DB.DBA.Review ( nr integer primary key, product integer not null, producer integer, person integer not null, reviewDate date not null, title varchar(200) not null, text long varchar not null, textlang char(2) not null, rating1 integer, rating2 integer, rating3 integer, rating4 integer, publisher integer not null, publishDate date not null ) ; grant SELECT on DB.DBA.Review to public ; create unique index review_product on DB.DBA.Review (product, producer, nr) ; create unique index review_producer_product on DB.DBA.Review (producer, product, nr) ; create bitmap index review_textlang on DB.DBA.Review (textlang) ; DB.DBA.XML_SET_NS_DECL ('foaf', 'http://xmlns.com/foaf/0.1/', 2) ; DB.DBA.XML_SET_NS_DECL ('dc', 'http://purl.org/dc/elements/1.1/', 2) ; DB.DBA.XML_SET_NS_DECL ('xsd', 'http://www.w3.org/2001/XMLSchema-datatypes/', 2) ; DB.DBA.XML_SET_NS_DECL ('rev', 'http://purl.org/stuff/rev#', 2) ; DB.DBA.XML_SET_NS_DECL ('bsbm', 'http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/vocabulary/', 2) ; DB.DBA.XML_SET_NS_DECL ('bsbm-inst', 'http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/', 2) ; SPARQL drop quad map bsbm:SingleGraphView ; SPARQL create iri class bsbm:ProductFeature-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/ProductFeature%d" (in nr integer not null) ; SPARQL create iri class bsbm:ProductType-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/ProductType%d" (in nr integer not null) ; SPARQL create iri class bsbm:Producer-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromProducer%d/Producer%d" (in nr_ integer not null, in nr integer not null) ; SPARQL create iri class bsbm:Product-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromProducer%d/Product%d" (in producer integer not null, in nr integer not null) ; SPARQL create iri class bsbm:Vendor-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromVendor%d/Vendor%d" (in nr_ integer not null, in nr integer not null) ; SPARQL create iri class bsbm:Offer-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromVendor%d/Offer%d" (in vendor integer not null, in nr integer not null) ; SPARQL create iri class bsbm:StdInst-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/StandardizationInstitution%d" (in publisher integer not null) ; SPARQL create iri class bsbm:Person-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromRatingSite%d/Person%d" (in publisher integer not null, in nr integer not null) ; SPARQL create iri class bsbm:Review-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromRatingSite%d/Review%d" (in site integer, in nr integer not null) ; SPARQL create iri class bsbm:ISO3166-country-iri "http://downlode.org/rdf/iso-3166/countries#%s" (in code varchar not null) ; SPARQL create iri class bsbm:homepage-iri "%s" (in homepage varchar not null) option (returns "http://%s") ; SPARQL create iri class bsbm:RatingSite-iri "http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromRatingSite%d/RatingSite%d" (in nr_ integer not null, in nr integer not null) ; SPARQL alter quad storage virtrdf:DefaultQuadStorage FROM DB.DBA.ProductFeature as pfeature FROM DB.DBA.ProductType as ptype FROM DB.DBA.Producer as producer FROM DB.DBA.Product as product text literal product.label FROM DB.DBA.ProductTypeProduct as ptypeproduct FROM DB.DBA.ProductFeatureProduct as pfeatureproduct FROM DB.DBA.Vendor as vendor FROM DB.DBA.Offer as offer FROM DB.DBA.Person as person FROM DB.DBA.Review as review where (^{product.}^.nr = ^{ptypeproduct.}^.product) where (^{product.}^.nr = ^{pfeatureproduct.}^.product) { create bsbm:SingleGraphView as graph <BSBM> option (exclusive) { bsbm:Product-iri (product.producer, product.nr) a bsbm:Product ; rdfs:label product.label ; rdfs:comment product.comment ; bsbm:producer bsbm:Producer-iri (product.producer, product.producer) ; bsbm:productPropertyTextual1 product.propertyTex1 ; bsbm:productPropertyTextual2 product.propertyTex2 ; bsbm:productPropertyTextual3 product.propertyTex3 ; bsbm:productPropertyTextual4 product.propertyTex4 ; bsbm:productPropertyTextual5 product.propertyTex5 ; bsbm:productPropertyTextual6 product.propertyTex6 ; bsbm:productPropertyNumeric1 product.propertyNum1 ; bsbm:productPropertyNumeric2 product.propertyNum2 ; bsbm:productPropertyNumeric3 product.propertyNum3 ; bsbm:productPropertyNumeric4 product.propertyNum4 ; bsbm:productPropertyNumeric5 product.propertyNum5 ; bsbm:productPropertyNumeric6 product.propertyNum6 ; rdf:type bsbm:ProductType-iri (ptypeproduct.productType) ; bsbm:productFeature bsbm:ProductFeature-iri (pfeatureproduct.productFeature) ; dc:publisher bsbm:Producer-iri (product.publisher, product.publisher) ; dc:date product.publishDate . bsbm:ProductType-iri (ptype.nr) a bsbm:ProductType ; rdfs:label ptype.label ; rdfs:comment ptype.comment ; rdfs:subClassOf bsbm:ProductType-iri (ptype.parent) ; dc:publisher bsbm:StdInst-iri (ptype.publisher) ; dc:date ptype.publishDate . bsbm:ProductFeature-iri (pfeature.nr) a bsbm:ProductFeature ; rdfs:label pfeature.label ; rdfs:comment pfeature.comment ; dc:publisher bsbm:StdInst-iri (pfeature.publisher) ; dc:date pfeature.publishDate . bsbm:Producer-iri (producer.nr, producer.nr) a bsbm:Producer ; rdfs:label producer.label ; rdfs:comment producer.comment ; foaf:homepage bsbm:homepage-iri (producer.homepage) ; bsbm:country bsbm:ISO3166-country-iri (producer.country) ; dc:publisher bsbm:Producer-iri (producer.nr, producer.nr) ; dc:date producer.publishDate . bsbm:Vendor-iri (vendor.nr, vendor.nr) a bsbm:Vendor ; rdfs:label vendor.label ; rdfs:comment vendor.comment ; foaf:homepage bsbm:homepage-iri (vendor.homepage) ; bsbm:country bsbm:ISO3166-country-iri (vendor.country) ; dc:publisher bsbm:Vendor-iri (vendor.publisher, vendor.publisher) ; dc:date vendor.publishDate . bsbm:Offer-iri (offer.vendor, offer.nr) a bsbm:Offer ; bsbm:product bsbm:Product-iri (offer.producer, offer.product) ; bsbm:vendor bsbm:Vendor-iri (offer.vendor, offer.vendor) ; bsbm:vendor bsbm:Vendor-iri (offer.vendor, offer.vendor) ; bsbm:price offer.price ; bsbm:validFrom offer.validFrom ; bsbm:validTo offer.validTo ; bsbm:deliveryDays offer.deliveryDays ; bsbm:offerWebpage bsbm:homepage-iri (offer.offerWebpage) ; dc:publisher bsbm:Vendor-iri (offer.publisher, offer.publisher) ; dc:date offer.publishDate . bsbm:Person-iri (person.publisher, person.nr) a foaf:Person ; foaf:name person.name ; foaf:mbox_sha1sum person.mbox_sha1sum ; bsbm:country bsbm:ISO3166-country-iri (person.country) ; dc:publisher bsbm:RatingSite-iri (person.publisher, person.publisher) ; dc:date person.publishDate . bsbm:Review-iri (review.publisher, review.nr) a rev:Review ; bsbm:reviewFor bsbm:Product-iri (review.producer, review.product) ; bsbm:producer bsbm:Producer-iri (review.producer, review.producer) ; rev:reviewer bsbm:Person-iri (review.publisher, review.person) ; bsbm:reviewDate review.reviewDate ; dc:title review.title ; rev:text review.text lang review.textlang ; bsbm:rating1 review.rating1 ; bsbm:rating2 review.rating2 ; bsbm:rating3 review.rating3 ; bsbm:rating4 review.rating4 ; dc:publisher bsbm:RatingSite-iri (review.publisher, review.publisher) ; dc:date review.publishDate . } } ;
RDF Views map relational data into RDF and allow customizing RDF representation of locally stored RDF data. To let SPARQL clients access relational data as well as physical RDF graphs in a single query, we introduce a declarative Meta Schema Language for mapping SQL Data to RDF Ontologies. As a result, all types of clients can efficiently access all data stored on the server. The mapping functionality dynamically generates RDF Data Sets for popular ontologies such as SIOC, SKOS, FOAF, and ATOM/OWL without disruption to the existing database infrastructure of Web 1.0 or Web 2.0 solutions. RDF views are also suitable for declaring custom representation for RDF triples, e.g. property tables, where one row holds many single-valued properties.
The Virtuoso RDF Views meta schema is a built-in feature of Virtuoso's SPARQL to SQL translator. It recognizes triple patterns that refer to graphs for which an alternate representation is declared and translates these into SQL accordingly. The main purpose of this is evaluating SPARQL queries against existing relational databases. There exists previous work from many parties for rendering relational data as RDF and opening it to SPARQL access. We can mention D2RQ, SPASQL, Squirrel RDF, DBLP and others. The Virtuoso effort differs from these mainly in the following:
Since most of the data that is of likely use for the emerging semantic web is stored in relational databases, the argument for exposing this to SPARQL access is clear. We note that historically, SQL access to relational data has essentially never been given to the public outside of the organization. If programmatic access to corporate IS has been available to partners or the public, it has been through dynamic web pages or more recently web services. There are reasons of performance, security, maintainability and so forth for this.
The culture of the emerging semantic web is however taking a different turn. Since RDF and OWL offer a mergeable and queryable model for heterogeneous data, it is more meaningful and maintainable to expose selected data for outside query than it would be with SQL. Advances in hardware make this also less of a performance issue than it would have been in the client-server database era.
In the context of Virtuoso, since Virtuoso is originally a virtual/federated database, incorporating SPARQL to relational mapping is an evident extension of the product's mission as a multi-protocol, multi-platform connector between information systems.
In the simplest sense, any relational schema can be rendered into RDF by converting all primary keys and foreign keys into IRI's, assigning a predicate IRI to each column, and an rdf:type predicate for each row linking it to a RDF class IRI corresponding to the table. Then a triple with the primary key IRI as subject, the column IRI as predicate and the column's value as object is considered to exist for each column that is neither part of a primary or foreign key.
Strictly equating a subject value to a row and each column to a predicate is often good but is too restrictive for the general case.
Thus in the most common case the RDF meta schema should consist of independent transformations; the domain of each transformation is a result-set of some SQL SELECT statement and range is a set of triples. The SELECT that produce the domain is quite simple: it does not use aggregate functions, joins and sorting, only inner joins and WHERE conditions. There is no need to support outer joins in the RDF meta schema because NULLs are usually bad inputs for functions that produce IRIs. In the rare cases when NULLs are OK for functions, outer joins can be encapsulated in SQL views. The range of mapping can be described by a SPARQL triple pattern: a pattern field is a variable if it depends on table columns, otherwise it is a constant. Values of variables in the pattern may have additional restrictions on datatypes, when datatypes of columns are known.
This common case of an RDF meta schema is implemented in Virtuoso, with one adjustment. Virtuoso stores quads, not triples, using the graph field (G) to indicate that a triple belongs to some particular application or resource. A SPARQL query may use quads from different graphs without large difference between G and the other three fields of a quad. E.g., variable ?g in expression GRAPH ?g {...} can be unbound. SPARQL has special syntax for "graph group patterns" that is convenient for sets of triple patterns with a common graph, but it also has shorthands for common subject and predicate, so the difference is no more than in syntax. There is only one feature that is specific for graphs but not for other fields: the SPARQL compiler can create restrictions on graphs according to FROM and FROM NAMED clauses.
Virtuoso RDF Views should offer the same flexibility with the graphs as SPARQL addressing physical triples. A transformation cannot always be identified by the graph used for ranges because graph may be composed from SQL data. The key element of the meta schema is a "quad map pattern". A simple quad map pattern fully defines one particular transformation from one set of relational columns into triples that match one SPARQL graph pattern. The main part of quad map pattern is four declarations of "quad map values", each declaration specifies how to calculate the value of the corresponding triple field from the SQL data. The pattern also lists boolean SQL expressions that should be used to filter out unwanted rows of source data (and to join multiple tables if source columns belong to different tables). There are also quad map patterns that group together similar quad patterns but do not specify any real transformation or even prevent unwanted transformations from being used, they are described in "Grouping Map Patterns" below.
Quad map values refer to schema elements of two further types: "IRI classes" and "literal classes".
An IRI class declares that a column or set of columns gets converted into a IRI in a certain way. The conversion of this sort can be declared revertible (bijection) so an IRI can be parsed into original SQL values; this is useful when some equality of an IRI constant and a calculated IRI can be replaced with an equality of a parse result of a constant and an SQL column that is index criteria or simply faster. In addition, the SPARQL optimizer will eliminate redundant conversions if one IRI class is explicitly declared as a subclass of another. The most flexible declaration for conversion consists of specifying functions that assemble and disassemble from IRI into its constituent parts. This is overkill for typical conversions so it is possible to specify only one sprintf-style format string such that sprintf() SQL function will print an IRI using this format and sprintf_inverse() will be able to parse it back.
The use of sprintf_inverse() assumes that the format does not contain fragments like '%s%s' that make it impossible to separate parts of IRI from each other.
In the following, we shall map the Virtuoso users and user roles system tables into the SIOC ontology.
create iri class oplsioc:user_iri "http://myhost/sys/user?id=%d" (in uid integer not null) . create iri class oplsioc:group_iri "http://myhost/sys/group?id=%d" (in gid integer not null) . create iri class oplsioc:membership_iri "http://myhost/sys/membership?super=%d&sub=%d" (in super integer not null, in sub integer not null) . create iri class oplsioc:dav_iri "http://myhost%s" (in path varchar) .
These IRI classes are used for mapping data from the DB.DBA.SYS_USERS and DB.DBA.SYS_ROLE_GRANTS system tables that are defined in Virtuoso as follows:
create table DB.DBA.SYS_USERS ( U_ID integer not null unique, U_NAME char (128) not null primary key, U_IS_ROLE integer default 0, U_FULL_NAME char (128), U_E_MAIL char (128) default ", U_ACCOUNT_DISABLED integer default 1, U_DAV_ENABLE integer default 0, U_SQL_ENABLE integer default 1, U_HOME varchar (128), . . . );
Single record in DB.DBA.SYS_USERS corresponds to a plain user or a group (role). Users and roles are collectively named "grantees". Thus a role may be granted to another role or to a user account. A role grant may be direct (explicit) or assigned by recursion.
create table SYS_ROLE_GRANTS ( GI_SUPER integer, GI_SUB integer, GI_DIRECT integer default 1, . . . primary key (GI_SUPER, GI_SUB, GI_DIRECT));
One IRI class usually corresponds to one ontology class, because similar things are usually called similarly. One may wish to use identifiers of ontology classes as identifiers of related IRI classes, to not remember double number of names, e.g. create IRI class mybank:XpressXfer for subjects that will have rdf:type property mybank:XpressXfer made by mapping. That is technically possible but proven to become inconvenient and misleading as application evolves. While RDF types tend to persist, IRI classes may change over time or same subject may get more than one name via more than one IRI class, say, for exports to different systems. It is found to be more convenient to compose names of IRI classes by adding some common prefixes or suffixes to RDF classes (or to table names), say, write create IRI class mybank:XpressXfer_iri.
A "literal class" declares that a column or set of columns gets converted into a literal instead of an IRI. More precisely, the result of conversion can be IRI_ID so it represents an IRI, but in current version of Virtuoso this is supported only for some internal built-in literal classes, not for classes declared by the user. So for user-defined literal class the result of the conversion is an RDF literal even if it is a string representation of a valid IRI.
In any case, a literal class can be used only in quad map values of O fields, because Virtuoso does not support literal values as subjects.
A special case of literal class is the identity class that converts a value from varchar column into an untyped literal and value from column of any other SQL datatype into a typed literal with type from XMLSchema set, i.e. xsd:integer, xsd:dateTime and so on. Columns of types ANY and IRI_ID are not supported.
The SPARQL optimizer knows that RDF literal types are pairwise disjoint so literal classes that produce literals of different types are known to be pairwise disjoint. The optimizer will replace a join on two disjoint literal classes with an empty statement, to simplify the resulting query.
The following declaration of quad map pattern is self-explanatory. The line for object uses identity literal class so there's no need to specify its name.
graph <http://myhost/sys> subject oplsioc:user_iri (DB.DBA.SYS_USERS.U_ID) predicate foaf:email object DB.DBA.SYS_USERS.U_E_MAIL
The description language also supports SPARQL-style notation that contains less keywords and eliminates duplicate graphs, subjects and predicates. The following add two patterns with constant graph IRI <http://myhost/sys> and subjects are made from column DB.DBA.SYS_USERS.U_ID by oplsioc:user_iri.
graph <http://myhost/sys> { oplsioc:user_iri (DB.DBA.SYS_USERS.U_ID) a sioc:user ; oplsioc:name DB.DBA.SYS_USERS.U_FULL_NAME . }
In real applications, quad map patterns should be named, for schema manipulation and keeping debug info readable. Thus it is much better to rewrite the previous example as
create virtrdf:SysUsers as graph <http://myhost/sys> { oplsioc:user_iri (DB.DBA.SYS_USERS.U_ID) a sioc:user as virtrdf:SysUserType-User; oplsioc:name DB.DBA.SYS_USERS.U_FULL_NAME as virtrdf:SysUsersFullName . }
Using these names, one may later write, say, drop quad map virtrdf:SysUserType-User.
One name, virtrdf:DefaultQuadMap is reserved. It is an internal quad map pattern used to access "native-form" quads from DB.DBA.RDF_QUAD:
create virtrdf:DefaultQuadMap as graph rdfdf:default-iid-nonblank (DB.DBA.RDF_QUAD.G) subject rdfdf:default-iid (DB.DBA.RDF_QUAD.S) predicate rdfdf:default-iid-nonblank (DB.DBA.RDF_QUAD.P) object rdfdf:default (DB.DBA.RDF_QUAD.O)
IRI classes from rdfdf:... namespace are also reserved.
The previous example actually contains three map patterns, not two. The name virtrdf:SysUsers refers to a "group map pattern" that does not define any real transformation of relational data into RDF but helps organize quad map patterns into a tree. Group may contain both quad map patterns and other groups. A group can be manipulated as a whole, e.g. drop quad map virtrdf:SysUsers will remove all three map patterns.
"Quad Storage" is a named set of quad map patterns. The declaration define input:storage storage-name states that a SPARQL query will be executed using only quad patterns of the given quad storage. Declarations of IRI classes, literal classes and quad patterns are shared between all quad storages of an RDF meta schema but every quad storage contains only a subset of all available quad patterns. Two quad storages are always defined:
Three statements for manipulating storages are
A map pattern can be created only as a part of create quad storage or alter quad storage statement, so initially it is used by exactly one storage. It can be imported to some other storage using directive create map-id using storage source-storage. E.g., declarations of many storages create virtrdf:DefaultQuadMap using storage virtrdf:DefaultQuadStorage.
Only a "top-level" quad map pattern (standalone or a whole group with descendants) can be imported, member of a group can not. The import directive also can not be a part of some group declaration.
The directive drop quad map map-name removes a map from one storage when it appears inside alter quad storage statement. Otherwise it removes the map from all storages. There exists garbage collection for quad map patterns, so any unused map is immediately deleted. A group is deleted with all its descendants.
When a SPARQL query is compiled into SQL using a quad storage, every triple pattern should become a subquery that retrieves data from relational tables. This subquery is an UNION ALL of joins generated from appropriate quad map patterns. The complete SQL query is composed from these basic subqueries. Thus the first operation of the SQL generation for a triple pattern is searching for quad map patterns that may in principle produce triples that match the triple pattern.
The more restrictions contained in the triple pattern the fewer quad map patterns will be used. A triple pattern graph ?g { ?s ?p ?o } is common enough to invoke all data transformations of the storage. A triple pattern graph <g> { ?s <p> <o> } will usually intersect with the range of only one quad map. Sometimes it is possible to prove that the storage can not contain any data that matches the given triple pattern, hence zero number of members of UNION ALL will result in constantly empty result-set.
The search for quad maps for a given pair of triple pattern and quad map storage is quite simple. The storage is treated as a tree of map patterns where quad map patterns are leafs, grouping patterns are inner nodes and the whole storage is also treated as a grouping pattern that specify no fields and contains all top-level map patterns of the storage.
The tree is traversed from the root, left to right, non-leaf vertex are checked before their children. The check of a vertex consists of up to four field checks, for G, S, P and O. Every field check compares the field definition in the vertex and the corresponding field in the triple pattern, G and G, S and S and so on. Note that a non-leaf vertex defines less than four of its fields, e.g., the root vertex does not define any of its fields and top-level graph map { ... } defines only graph. Checks are performed only for defined fields and return one of three values: "failed", "passed", "full match", according to the following rules:
Field of vertex | Field in triple pattern | Result |
---|---|---|
constant | same constant | full match |
constant | different constant | failed |
constant | variable of same type | passed |
constant | variable of different type | failed |
quad map value | constant of same type | full match |
quad map value | constant of different type | failed |
quad map value of type X | variable, X or subtype of X | full match |
quad map value of type X | variable, supertype of X | passed |
quad map value of type X | variable, type does not intersect with X | failed |
If any of the checks fails, the vertex and all its children are excluded from the rest of processing. Otherwise, if all four fields are defined for the quad map pattern, the map is added to the list of matching map patterns. The difference between "passed" and "full match" is significant only if the map is declared with option (exclusive) If all performed checks return "full match" and option (exclusive) is set then the traverse of the tree is stopped as soon as all children of the vertex are traversed. The most typical use of this option is when the application developer is sure that all triples of a graph belong to his application and they come from his own quad map patterns, not from DB.DBA.RDF_QUAD. This is to prevent the SPARQL compiler from generating redundant subqueries accessing DB.DBA.RDF_QUAD. The declaration may look like
create quad storage <mystorage> { graph <mygraph> option (exclusive) { . . . } create virtrdf:DefaultQuadMap using storage virtrdf:DefaultQuadStorage . }
Exclusive patterns make the order of declarations important, because an exclusive declaration may "throw a shadow" on declarations after it. Consider a database that have a special table RDF_TYPE that caches all RDF types of all subjects in all graphs. Consider two declarations: all triples from graph <http://myhost/sys> and all triples with rdf:type predicate, both exclusive:
graph <http://myhost/sys> option (exclusive) { . . . # mapping of DB.DBA.SYS_USERS as in previous examples. } graph rdfdf:default-iid-nonblank (DB.DBA.RDF_TYPE.G) subject rdfdf:default-iid (DB.DBA.RDF_TYPE.S) predicate rdf:type object rdfdf:default (DB.DBA.RDF_TYPE.O) option (exclusive)
The order of these declarations dictates that triple pattern
graph <http://myhost/sys> {?s rdf:type ?o}
is compiled using only quad map patterns of the graph declaration, ignoring second declaration (and of course ignoring default mapping rule, if any). An explicit option (order N) at the end of quad map pattern will tweak the priority. By default, order will grow from 1000 for the first declaration in the statement to 1999 for the last, explicit configuration is especially useful to make order persistent to alter storage statements.
The option (exclusive) trick is ugly, low-level and prone to cause compilation errors after altering storage declarations. When misused, it is as bad as "red cut" in PROLOG, but one must use this trick to build scalable storages.
The option (exclusive) helps the SPARQL compiler to prepare better SQL queries, but sometimes it is "too exclusive". For instance, if a grouping quad map pattern specify only quad map value for graph and no other fields then making it exclusive prohibits the use of all declarations of the storage after that one. Sometimes it is better to notify compiler that quads made by the given quad map pattern are supposed to be different from all quads made by declarations listed after the given one.
Consider an application that exports users' personal data as graphs whose IRIs looks like http://www.example.com/DAV/home/username/RDF/personal/; the application makes a query and a triple pattern is proven to be restrictive enough to filter out all quads that are not similar to quads generated by the given quad map pattern (say, the graph is constant http://www.example.com/DAV/home/JohnSmith/RDF/personal/). The application do not hope to find any quads that match the pattern but made by other applications, because graphs named like in the pattern are supposed to be solely for this single purpose; if, say, DB.DBA.RDF_QUAD occasionally contains some quads with graph equal to http://www.example.com/DAV/home/JohnSmith/RDF/personal/ then they can be ignored.
Under this circumstances, the quad map pattern may have option (soft exclusive). That grants a permission to the compiler to ignore rest of storage as soon as it is proven that the triple pattern can not access quads that does not match the pattern. So if that is proven then the pattern is exclusive and it makes the query faster; when unsure, the compiler work like there is no option at all.
The option (exclusive) can be used as a security measure, option (soft exclusive) can not. Say, if an financial application exports its data as a single graph http://www.example.com/front-office/cash/ using exclusive then the query that explicitly refers to that graph will never access any quads written by the attacker into DB.DBA.RDF_QUAD using same graph IRI. The use of soft exclusive gives no such protection. From the compiler's perspective, the option (soft exclusive) is a hint that may be ignored, not an unambiguous order.
There is one exception from the rules described above. This exception is for virtrdf:DefaultQuadStorage only. If a graph variable of a quad map pattern is not bound and no source graph specified by FROM clauses then quad maps for specific constant graphs are ignored. In other words, if a default quad storage contains quad maps for specific graphs then the query in that storage should explicitly specify the graph in order to use a map for graph. This rule will not work if the default quad map is removed from the virtrdf:DefaultQuadStorage. This rule relates to the default storage itself, not to the containing patterns; copying some or all patterns into other storage will not reproduce there this special effect.
Quad map patterns of an application usually share a common set of source tables and quad map values of one pattern usually share either a single table or very small number of joined tables. Join and filtering conditions are also usually repeated in different patterns. It is not necessary to type table descriptions multiple times, they are declare once in the beginning of storage declaration statement and shared between all quad map declarations inside the statement. Names of aliases can be used instead of table names in quad map values.
FROM DB.DBA.SYS_USERS as user WHERE (^{user.}^.U_IS_ROLE = 0) FROM DB.DBA.SYS_USERS as group WHERE (^{group.}^.U_IS_ROLE = 1) FROM DB.DBA.SYS_USERS as account FROM user as active_user WHERE (^{active_user.}^.U_ACCOUNT_DISABLED = 0) FROM DB.DBA.SYS_ROLE_GRANTS as grant WHERE (^{grant.}^.GI_SUPER = ^{account.}^.U_ID) WHERE (^{grant.}^.GI_SUB = ^{group.}^.U_ID) WHERE (^{grant.}^.GI_SUPER = ^{user.}^.U_ID)
This declares five distinct aliases for two distinct tables, and six filtering conditions. Every condition is an SQL expression with placeholders where a reference to the table should be printed. The SPARQL compiler will not try to parse texts of these expressions (except dummy search for placeholders), so any logical expressions are acceptable. When a quad map pattern declaration refers to some aliases, the WHERE clause of the generated SQL code will contain a conjunction of all distinct texts of "relevant" conditions. A condition is relevant if every alias inside the condition is used in some quad map value of the map pattern, either directly or via clause like from user as active_user. (user is a "base alias" for active_user).
Consider a group of four declarations.
graph <http://myhost/sys> { oplsioc:user_iri (active_user.U_ID) a oplsioc:active-user . oplsioc:membership_iri (grant.GI_SUPER, grant.GI_SUB). oplsioc:is_direct grant.GI_DIRECT ; oplsioc:member-e-mail active_user.U_E_MAIL where (^{active_user.}^.U_E_MAIL like 'mailto:%'). ldap:account-ref (account.U_NAME) ldap:belongs-to ldap:account-ref (group.U_NAME) option (using grant). }
The first declaration will extend <http://myhost/sys> graph with one imaginary triples { user a oplsioc:active-user } for every account record that is not a role and not disabled. The second declaration deals with membership records. A membership is a pair of a grantee ("super") and a granted role ("sub") stored as a row in DB.DBA.SYS_ROLE_GRANTS).
The second declaration states that every membership has oplsioc:is_direct property with value from GI_DIRECT column of that table (roles may be granted to other roles and users, so permissions are "direct" or "recursive").
The third declaration declares oplsioc:member-e-mail property of memberships. The value is a literal string from DB.DBA.SYS_USERS.U_E_MAIL, if the grantee is active (not disabled) and is not a role and its e-mail address starts with 'mailto:'. The join between DB.DBA.SYS_ROLE_GRANTS and DB.DBA.SYS_USERS is made by equality (GI_SUPER = U_ID) because the alias active_user in the declaration "inherits" all conditions specified for user. In addition, the SPARQL compiler will add one more condition to check if the U_E_MAIL is not null because the NULL value is not a valid object and it knows that U_E_MAIL is not declared as NOT NULL.
The last declaration contains an option clause. As usual, this indicates that the basic functionality is good for many tasks but not for all. In this declaration, the ldap:belongs-to property establishes a relation between grantee (subject) and a granted role (object). Both subject and object IRIs are based on account name, DB.DBA.SYS_USERS.U_NAME, so the quad map pattern contains two references to different aliases of DB.DBA.SYS_USERS but no alias for DB.DBA.SYS_ROLE_GRANTS. Hence the declaration could produce a triple for every row of the Cartesian product of the DB.DBA.SYS_USERS. To fix the problem, option (using alias-name) tells the compiler to process the alias-name as if it's used in some quad map value of the pattern.
It is an error to use an alias only in where clause of the quad map pattern but neither in values or in option (using alias-name). To detect more typos, an alias used in quad map values can not appear in option (using alias-name) clause.
Most of IRI classes can be declared by a sprintf format string, but sophisticated cases may require calculations, not only printing the string. create IRI class using function allows the application transform relational values to IRIs by any custom routines.
Let us extend the previous example about users and groups by a new class for grantees. Both users and groups are grantees and we have defined two IRI classes for them. Classes oplsioc:user_iri and oplsioc:group_iri work fine for quad maps of U_ID if and only if the value of U_IS_ROLE is accordingly restricted to FALSE or TRUE, otherwise one may occasionally generate, say, user IRI for a group. To create and parse IRIs that correspond to any U_IDs, two functions should be created:
create function DB.DBA.GRANTEE_URI (in id integer) returns varchar { declare isrole integer; isrole := coalesce ((SELECT top 1 U_IS_ROLE FROM DB.DBA.SYS_USERS WHERE U_ID = id ) ); if (isrole is null) return NULL; else if (isrole) return sprintf ('http://%s/sys/group?id=%d', id); else return sprintf ('http://%s/sys/user?id=%d', id); };
create function DB.DBA.GRANTEE_URI_INVERSE (in id_iri varchar) returns integer { declare parts any; parts := sprintf_inverse (id_iri, 'http://myhost/sys/user?id=%d', 1 ); if (parts is not null) { if (exists (SELECT top 1 1 FROM DB.DBA.SYS_USERS WHERE U_ID = parts[0] and not U_IS_ROLE ) ) return parts[0]; } parts := sprintf_inverse (id_iri, 'http://myhost/sys/group?id=%d', 1 ); if (parts is not null) { if (exists (SELECT top 1 1 FROM DB.DBA.SYS_USERS WHERE U_ID = parts[0] and U_IS_ROLE ) ) return parts[0]; } return NULL; };
These functions may be more useful if the SPARQL web service endpoint is allowed to use them:
grant execute on DB.DBA.GRANTEE_URI to "SPARQL"; grant execute on DB.DBA.GRANTEE_URI_INVERSE to "SPARQL";
The next declaration creates an IRI class based on these two functions:
create iri class oplsioc:grantee_iri using function DB.DBA.GRANTEE_URI (in id integer) returns varchar, function DB.DBA.GRANTEE_URI_INVERSE (in id_iri varchar) returns integer .
In common case, IRI class declaration contains an N-array function that composes IRIs and N inverse functions that gets an IRI as an argument and extracts the Nth SQL value. IRI composing function should silently return NULL on incorrect arguments instead of error signal. Inverse functions should return NULL if the argument has an incorrect type or value.
It is possible to specify only composing function without any of inverse functions. However option (bijection) can not be used in that case, obviously.
Writing function-based IRI class is overkill when the IRI can in principle be made by a sprintf_iri but the format should contain some context-specific data, such as host name used for the dynamic renaming of local IRIs. Format strings offer a special syntax for that cases. %{varname}U acts as %U but the function sprintf will take the value from client connection variable varname, not from list of arguments. Similarly, sprintf_inverse will not return fragment that match to %{varname}U in the vector of other fragments; instead it will get the value from connection environment and ensure that it matches the fragment of input; mismatch between printed and actual value of variable will means that the whole string do not match the format.
SPARQL optimizer knows about this formatting feature and sometimes it makes more deductions from occurrence of %{varname}U than from occurrence of plain %U, so this notation may be used in option ( returns ...) when appropriate. Of course, the optimizer has no access to the actual value of connection variable because it may vary from run to run or may change between the compilation and the run, but the value is supposed to be persistent during any single query run so %{myvariable}U in one place is equal to %{myvariable}U in other.
Connection variables are set by connection_set and some of them have default values that are used if not overridden by application:
It is inconvenient to write different format strings for different cases. Two most common policies are different host names for default HTTP port of a publicly available service and different non-default ports for one or more host names of an intranet installation; these two approaches are almost never used in a mix. So declaration of IRI classes may use shorthand ^{DynamicLocalFormat}^ in format strings that is expanded either to http://%{WSHost}U or to http://%{WSHostName}U:%{WSHostPort}U/..., depending on absence or presence of port number in the value of DefaultHost parameter of URIQA section of configuration file.
^{DynamicLocalFormat}^ is for IRI class declarations only and is not expanded in any other place, so it is useful sometimes to create an IRI class with empty argument list in order to get "almost constant" IRIs calculated without writing special procedures.
There is one subtle problem with IRI class declarations. To get benefit from a relational index, SPARQL optimizer should compose equality between table column and some known SQL value, not between return value of IRI class and a known composed IRI. In addition, redundant calculations of IRIs takes time. To enable this optimization, an IRI class declaration should end with option (bijection) clause. For some simple format strings the compiler may recognize the bijection automatically but an explicit declaration is always a good idea.
See also: Wikipedia - Bijection. In mathematics, a bijection, or a bijective function is a function f from a set X to a set Y such that, for every y in Y, there is exactly one x in X such that f(x) = y.
Alternatively, f is bijective if it is a one-to-one correspondence between those sets; i.e., both one-to-one (injective) and onto (surjective).
The SPARQL compiler may produce big amounts of SQL code when the query contains equality of two calculated IRIs and these IRIs may come from many different IRI classes. It is possible to provide hints that will let the compiler check if two IRI classes form disjoint sets of possible IRI values. The more disjoint sets are found the less possible combinations remain so the resulting SQL query will contain fewer unions of joins. The SPARQL compiler can prove some properties of sprintf format strings. E.g., it can prove that set of all strings printed by "http://example.com/item%d" and the set of strings printed by "http://example.com/item%d/" are disjoint. It can prove some more complicated statements about unions and intersections of sets of strings. The IRI or literal class declaration may contain option (returns ...) clause that will specify one or more sprintf patterns that cover the set of generated values. Consider a better version of IRI class declaration listed above:
create iri class oplsioc:grantee_iri using function DB.DBA.GRANTEE_URI (in id integer) returns varchar, function DB.DBA.GRANTEE_URI_INVERSE (in id_iri varchar) returns integer option ( bijection, returns "http://myhost/sys/group?id=%d" union "http://myhost/sys/user?id=%d" ) .
It is very important to keep IRI classes easily distinguishable by the text of IRI string and easy to parse.
In some cases option (returns ...) can be used for IRI classes that are declared using sprintf format, but actual data have more specific format. Consider a literal class declaration that is used to output strings and the application knows that all these strings are ISBN numbers:
create literal class example:isbn_ref "%s" (in isbn varchar not null) option ( bijection, returns "%u-%u-%u-%u" union "%u-%u-%u-X" )
Sometimes interoperability restrictions will force you to violate these rules but please try to follow them as often as possible.
Additional problem appears when the equality is between two IRIs of two different IRI classes. Even if both of them are bijections, the compiler does not know if these IRI classes behave identically on the intersection of their domains. To let the optimizer know this fact, one IRI class can be explicitly declared as a subclass of another:
make oplsioc:user_iri subclass of oplsioc:grantee_iri . make oplsioc:group_iri subclass of oplsioc:grantee_iri .
The SPARQL compiler can not check the validity of a subclass declaration. The developer should carefully test functions to ensure that transformations are really subclasses, as well as to ensure that functions of an IRI class declarations are really inverse to each other.
When declaring that a table's primary key is converted into a IRI according to one IRI class, one usually declares that all foreign keys referring to this class also get converted into an IRI as per this same class, or subclass of same class.
Subclasses can be declared for literal classes as well as for IRI classes, but this case is rare. The reason is that most of literals are made by identity literal classes that are disjoint to each other even if values may be equal in SQL sense, such as "2" of type xsd:integer and "2.0" of type xsd:double.
This section refers to checking and backing up RDF view and storage declarations only. The checks and backup/restore do not affect physical quads, relational schema or tables or data therein. For general backup and restore, see server administration. To detect and fix automatically most popular sorts of RDF metadata corruption use DB.DBA.RDF_AUDIT_METADATA. It is also possible to backup RDF data by DB.DBA.RDF_BACKUP_METADATA and restore the saved state later by using DB.DBA.RDF_RESTORE_METADATA. It is convenient to make a backup before any modification of quad storages, quad map patterns or IRI classes, especially during debugging new RDF Views.
In SQL, adding a new view can not break anything. This is because SQL lacks the ability of querying "everything" so data sources are always specified. This is not true for SPARQL, so please treat any metadata manipulation as potentially destructive operation. If an RDF storage is supposed to be used by more than one application then these applications should be tested together, not one after other, and they should be installed/upgraded on live database in the very same order as they were installed/upgraded on instrumental machine during testing. Always remember that these applications share RDF tables so they may interfere.
RDF View can be created by two or more "sparql alter storage" statements. In each statement can be created one quad map that contains mappings for half or a third of all tables. Quad maps created should have distinct names but may mention same graph. The important fact is that if the RDF View in question is exclusive for a graph then only the last quad map should be exclusive but all previous should not have this option. This is because if a map is exclusive on a graph the rest of maps on that graph will be silently ignored.
The example below shows a sample part of the Virtuoso eCRM Views code, where the RDF view is split in two parts: with quad map virtrdf:ecrmDemo1 and with quad map virtrdf:ecrmDemo2:
SPARQL prefix ecrm: <http://demo.openlinksw.com/schemas/ecrm#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix cal: <http://www.w3.org/2002/12/cal/ical#> prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> prefix product: <http://www.swop-project.eu/ontologies/pmo/product.owl#> prefix owl: <http://www.w3.org/2002/07/owl#> drop quad map virtrdf:ecrmDemo1 . ; SPARQL prefix ecrm: <http://demo.openlinksw.com/schemas/ecrm#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix cal: <http://www.w3.org/2002/12/cal/ical#> prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> prefix product: <http://www.swop-project.eu/ontologies/pmo/product.owl#> prefix owl: <http://www.w3.org/2002/07/owl#> drop quad map virtrdf:ecrmDemo2 . ; ... SPARQL prefix ecrm: <http://demo.openlinksw.com/schemas/ecrm#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix cal: <http://www.w3.org/2002/12/cal/ical#> prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> prefix product: <http://www.swop-project.eu/ontologies/pmo/product.owl#> prefix owl: <http://www.w3.org/2002/07/owl#> alter quad storage virtrdf:DefaultQuadStorage FROM eCRM.DBA.SFA_SALES_QUOTA_VIEW2 as sales_quotas FROM eCRM.DBA.SFA_COMPANIES_VIEW2 as companies FROM eCRM.DBA.SFA_COMPANIES as companies_table text literal companies_table.DESCRIPTION of (companies.DESCRIPTION) FROM eCRM.DBA.SFA_CONTACTS_VIEW2 as contacts FROM eCRM.DBA.SFA_CONTACTS as contacts_table text literal contacts_table.NAME_FIRST of (contacts.NAME_FIRST) FROM eCRM.DBA.SFA_EMPLOYMENTS_VIEW2 as employments FROM eCRM.DBA.SFA_LEADS_VIEW2 as leads FROM eCRM.DBA.SFA_LEADS as leads_table text literal leads_table.SUBJECT of (leads.SUBJECT) FROM eCRM.DBA.SFA_OPPORTUNITIES_VIEW2 as opportunities FROM eCRM.DBA.SFA_OPPORTUNITIES as opportunities_table text literal opportunities_table.OPPORTUNITY_NAME of (opportunities.OPPORTUNITY_NAME) FROM eCRM.DBA.SFA_ACTIVITIES as activities FROM eCRM.DBA.SFA_MAIL_MESSAGES as messages FROM eCRM.DBA.SFA_DOCUMENTS_VIEW2 as documents FROM eCRM.DBA.SFA_INFLUENCERS_VIEW2 as influencers FROM eCRM.DBA.SFA_TEAMS_VIEW2 as teams FROM eCRM.DBA.SFA_NOTES_VIEW2 as notes FROM eCRM.DBA.SFA_NOTES as notes_table text literal notes_table.DESCRIPTION of (notes.DESCRIPTION) FROM eCRM.DBA.SFA_COMPETITORS_VIEW2 as competitors FROM eCRM.DBA.SFA_ISSUES_VIEW2 as issues FROM eCRM.DBA.SFA_CUSTOM_FIELD_DEFS_VIEW2 as custom_field_defs FROM eCRM.DBA.SFA_CUSTOM_FIELDS_VIEW2 as custom_fields FROM eCRM.DBA.SFA_CASES_VIEW2 as cases FROM eCRM.DBA.SFA_CASES as cases_table text literal cases_table.SUMMARY of (cases.SUMMARY) FROM eCRM.DBA.SFA_ORDERS_VIEW2 as orders FROM eCRM.DBA.SFA_ORDERS as orders_table text literal orders_table.EMAIL of (orders.EMAIL) FROM eCRM.DBA.SFA_ORDER_ITEMS_VIEW2 as order_items FROM eCRM.DBA.PM_CATEGORIES_VIEW2 as categories FROM eCRM.DBA.PM_PRODUCT_ATTRIBUTE_DEFS_VIEW2 as product_attribute_defs FROM eCRM.DBA.PM_PRODUCTS_VIEW2 as products FROM eCRM.DBA.PM_PRODUCTS as products_table text literal products_table.DESCRIPTION of (products.DESCRIPTION) FROM eCRM.DBA.PM_PRODUCT_ATTRIBUTES_VIEW2 as product_attributes FROM eCRM.DBA.PM_CATALOGS_VIEW2 as catalogs FROM eCRM.DBA.PM_CATALOG_PRODUCTS_VIEW2 as catalog_products FROM eCRM.DBA.XSYS_MODULES as modules FROM eCRM.DBA.XSYS_REGISTRY as registries FROM eCRM.DBA.XSYS_ORGANIZATIONS_DATA as organizations_data FROM eCRM.DBA.XSYS_MESSAGES as xsysmessages FROM eCRM.DBA.XSYS_COUNTRIES_VIEW2 as countries FROM eCRM.DBA.XSYS_PROVINCES_VIEW2 as provinces FROM eCRM.DBA.XSYS_TIMEZONES as timezones FROM eCRM.DBA.XSYS_MIME_TYPES as mimetypes FROM eCRM.DBA.XSYS_MIME_EXTENSIONS as mimeexts FROM eCRM.DBA.XSYS_CNAMES as cnames FROM eCRM.DBA.XSYS_QUOTAS as quotas FROM eCRM.DBA.XSYS_ROLES as roles FROM eCRM.DBA.XSYS_ACCOUNTS as accounts FROM eCRM.DBA.XSYS_USERDATA as userdatas FROM eCRM.DBA.XSYS_GROUPDATA as groupdatas FROM eCRM.DBA.XSYS_MEMBERS as members FROM eCRM.DBA.XSYS_SESSIONS_DATA as sessionsdatas FROM eCRM.DBA.XSYS_SESSION_DATA as sessiondatas FROM eCRM.DBA.XSYS_LIST_MEMBERS_DEFS as list_members_defs FROM eCRM.DBA.XSYS_CLASSES as classes FROM eCRM.DBA.XSYS_ORG_CLASSES as org_classes FROM eCRM.DBA.XSYS_CLASS_METHODS as class_methods FROM eCRM.DBA.XSYS_CLASS_VIEWS as class_views FROM eCRM.DBA.XSYS_ROLE_PRIVILEGES as role_priveleges FROM eCRM.DBA.XSYS_USER_PRIVILEGES as user_priveleges FROM eCRM.DBA.XSYS_HISTORY as history FROM eCRM.DBA.XSYS_USERS as xsys_users FROM eCRM.DBA.AP_PROCESSES_VIEW2 as ap_processes FROM eCRM.DBA.AP_RULES_VIEW2 as ap_rules FROM eCRM.DBA.AP_QUEUE as ap_queues WHERE (^{companies.}^.COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{contacts.}^.COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{leads.}^.COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{products.}^.COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{orders.}^.SHIP_COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{leads_table.}^.FREETEXT_ID = ^{leads.}^.FREETEXT_ID) WHERE (^{contacts_table.}^.FREETEXT_ID = ^{contacts.}^.FREETEXT_ID) WHERE (^{companies_table.}^.FREETEXT_ID = ^{companies.}^.FREETEXT_ID) WHERE (^{opportunities_table.}^.FREETEXT_ID = ^{opportunities.}^.FREETEXT_ID) WHERE (^{cases_table.}^.FREETEXT_ID = ^{cases.}^.FREETEXT_ID) WHERE (^{notes_table.}^.FREETEXT_ID = ^{notes.}^.FREETEXT_ID) WHERE (^{orders_table.}^.FREETEXT_ID = ^{orders.}^.FREETEXT_ID) WHERE (^{products_table.}^.FREETEXT_ID = ^{products.}^.FREETEXT_ID) { create virtrdf:ecrmDemo1 as graph iri ("http://^{URIQADefaultHost}^/ecrm") option (order 1501) { ecrm:Country (countries.COUNTRY_NAME) a ecrm:Country as virtrdf:Country-Countrys2 ; a geo:SpatialThing as virtrdf:Country-Countrys ; owl:sameAs ecrm:dbpedia_iri (countries.COUNTRY_NAME) ; ecrm:countryID countries.COUNTRY_ID as virtrdf:Country-COUNTRY_ID ; ecrm:countryID3 countries.COUNTRY_ID3 as virtrdf:Country-COUNTRY_ID3 ; ecrm:isoCode countries.ISO_CODE as virtrdf:Country-ISO_CODE ; ecrm:countryName countries.COUNTRY_NAME as virtrdf:Country-COUNTRY_NAME . ecrm:Country (countries.COUNTRY_NAME) ecrm:has_province ecrm:Province (provinces.COUNTRY_ID, provinces.PROVINCE_NAME) where (^{provinces.}^.COUNTRY_ID = ^{countries.}^.COUNTRY_ID) as virtrdf:ecrmCountry-has_province . ... } . } . ; SPARQL prefix ecrm: <http://demo.openlinksw.com/schemas/ecrm#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> prefix cal: <http://www.w3.org/2002/12/cal/ical#> prefix product: <http://www.swop-project.eu/ontologies/pmo/product.owl#> prefix owl: <http://www.w3.org/2002/07/owl#> alter quad storage virtrdf:DefaultQuadStorage FROM eCRM.DBA.SFA_SALES_QUOTA_VIEW2 as sales_quotas FROM eCRM.DBA.SFA_COMPANIES_VIEW2 as companies FROM eCRM.DBA.SFA_COMPANIES as companies_table text literal companies_table.DESCRIPTION of (companies.DESCRIPTION) FROM eCRM.DBA.SFA_CONTACTS_VIEW2 as contacts FROM eCRM.DBA.SFA_CONTACTS as contacts_table text literal contacts_table.NAME_FIRST of (contacts.NAME_FIRST) FROM eCRM.DBA.SFA_EMPLOYMENTS_VIEW2 as employments FROM eCRM.DBA.SFA_LEADS_VIEW2 as leads FROM eCRM.DBA.SFA_LEADS as leads_table text literal leads_table.SUBJECT of (leads.SUBJECT) FROM eCRM.DBA.SFA_OPPORTUNITIES_VIEW2 as opportunities FROM eCRM.DBA.SFA_OPPORTUNITIES as opportunities_table text literal opportunities_table.OPPORTUNITY_NAME of (opportunities.OPPORTUNITY_NAME) FROM eCRM.DBA.SFA_ACTIVITIES as activities FROM eCRM.DBA.SFA_MAIL_MESSAGES as messages FROM eCRM.DBA.SFA_DOCUMENTS_VIEW2 as documents FROM eCRM.DBA.SFA_INFLUENCERS_VIEW2 as influencers FROM eCRM.DBA.SFA_TEAMS_VIEW2 as teams FROM eCRM.DBA.SFA_NOTES_VIEW2 as notes FROM eCRM.DBA.SFA_NOTES as notes_table text literal notes_table.DESCRIPTION of (notes.DESCRIPTION) FROM eCRM.DBA.SFA_COMPETITORS_VIEW2 as competitors FROM eCRM.DBA.SFA_ISSUES_VIEW2 as issues FROM eCRM.DBA.SFA_CUSTOM_FIELD_DEFS_VIEW2 as custom_field_defs FROM eCRM.DBA.SFA_CUSTOM_FIELDS_VIEW2 as custom_fields FROM eCRM.DBA.SFA_CASES_VIEW2 as cases FROM eCRM.DBA.SFA_CASES as cases_table text literal cases_table.SUMMARY of (cases.SUMMARY) FROM eCRM.DBA.SFA_ORDERS_VIEW2 as orders FROM eCRM.DBA.SFA_ORDERS as orders_table text literal orders_table.EMAIL of (orders.EMAIL) FROM eCRM.DBA.SFA_ORDER_ITEMS_VIEW2 as order_items FROM eCRM.DBA.PM_CATEGORIES_VIEW2 as categories FROM eCRM.DBA.PM_PRODUCT_ATTRIBUTE_DEFS_VIEW2 as product_attribute_defs FROM eCRM.DBA.PM_PRODUCTS_VIEW2 as products FROM eCRM.DBA.PM_PRODUCTS as products_table text literal products_table.DESCRIPTION of (products.DESCRIPTION) FROM eCRM.DBA.PM_PRODUCT_ATTRIBUTES_VIEW2 as product_attributes FROM eCRM.DBA.PM_CATALOGS_VIEW2 as catalogs FROM eCRM.DBA.PM_CATALOG_PRODUCTS_VIEW2 as catalog_products FROM eCRM.DBA.XSYS_MODULES as modules FROM eCRM.DBA.XSYS_REGISTRY as registries FROM eCRM.DBA.XSYS_ORGANIZATIONS_DATA as organizations_data FROM eCRM.DBA.XSYS_MESSAGES as xsysmessages FROM eCRM.DBA.XSYS_COUNTRIES_VIEW2 as countries FROM eCRM.DBA.XSYS_PROVINCES_VIEW2 as provinces FROM eCRM.DBA.XSYS_TIMEZONES as timezones FROM eCRM.DBA.XSYS_MIME_TYPES as mimetypes FROM eCRM.DBA.XSYS_MIME_EXTENSIONS as mimeexts FROM eCRM.DBA.XSYS_CNAMES as cnames FROM eCRM.DBA.XSYS_QUOTAS as quotas FROM eCRM.DBA.XSYS_ROLES as roles FROM eCRM.DBA.XSYS_ACCOUNTS as accounts FROM eCRM.DBA.XSYS_USERDATA as userdatas FROM eCRM.DBA.XSYS_GROUPDATA as groupdatas FROM eCRM.DBA.XSYS_MEMBERS as members FROM eCRM.DBA.XSYS_SESSIONS_DATA as sessionsdatas FROM eCRM.DBA.XSYS_SESSION_DATA as sessiondatas FROM eCRM.DBA.XSYS_LIST_MEMBERS_DEFS as list_members_defs FROM eCRM.DBA.XSYS_CLASSES as classes FROM eCRM.DBA.XSYS_ORG_CLASSES as org_classes FROM eCRM.DBA.XSYS_CLASS_METHODS as class_methods FROM eCRM.DBA.XSYS_CLASS_VIEWS as class_views FROM eCRM.DBA.XSYS_ROLE_PRIVILEGES as role_priveleges FROM eCRM.DBA.XSYS_USER_PRIVILEGES as user_priveleges FROM eCRM.DBA.XSYS_HISTORY as history FROM eCRM.DBA.XSYS_USERS as xsys_users FROM eCRM.DBA.AP_PROCESSES_VIEW2 as ap_processes FROM eCRM.DBA.AP_RULES_VIEW2 as ap_rules FROM eCRM.DBA.AP_QUEUE as ap_queues WHERE (^{companies.}^.COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{contacts.}^.COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{leads.}^.COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{products.}^.COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{orders.}^.SHIP_COUNTRY_NAME = ^{countries.}^.COUNTRY_NAME) WHERE (^{leads_table.}^.FREETEXT_ID = ^{leads.}^.FREETEXT_ID) WHERE (^{contacts_table.}^.FREETEXT_ID = ^{contacts.}^.FREETEXT_ID) WHERE (^{companies_table.}^.FREETEXT_ID = ^{companies.}^.FREETEXT_ID) WHERE (^{opportunities_table.}^.FREETEXT_ID = ^{opportunities.}^.FREETEXT_ID) WHERE (^{cases_table.}^.FREETEXT_ID = ^{cases.}^.FREETEXT_ID) WHERE (^{notes_table.}^.FREETEXT_ID = ^{notes.}^.FREETEXT_ID) WHERE (^{orders_table.}^.FREETEXT_ID = ^{orders.}^.FREETEXT_ID) WHERE (^{products_table.}^.FREETEXT_ID = ^{products.}^.FREETEXT_ID) { create virtrdf:ecrmDemo2 as graph iri ("http://^{URIQADefaultHost}^/ecrm") option (exclusive, order 1502) { ecrm:Order (orders.ORG_ID, orders.ORDER_ID) a ecrm:Order as virtrdf:Order-Orders ; ecrm:has_ecrm_organization ecrm:OrganizationsData(orders.ORG_ID, organizations_data.DNS_ZONE) where (^{orders.}^.ORG_ID = ^{organizations_data.}^.ORG_ID) as virtrdf:Order-ORG_ID ; ecrm:owner ecrm:XSys_User(orders.ORG_ID, xsys_users.ACCOUNT_NAME, orders.OWNER_ID) where (^{orders.}^.OWNER_ID = ^{xsys_users.}^.ACCOUNT_ID and ^{orders.}^.ORG_ID = ^{xsys_users.}^.ORG_ID) as virtrdf:Order-OWNER_ID ; ecrm:FREETEXT_ID orders.FREETEXT_ID as virtrdf:Order-FREETEXT_ID ; ecrm:has_company ecrm:Company(orders.COMPANY_NAME, orders.COMPANY_ID, orders.ORG_ID) as virtrdf:Order-COMPANY_ID ; ecrm:companyName orders.COMPANY_NAME as virtrdf:Order-COMPANY_NAME ; ecrm:has_contact ecrm:Contact(contacts.NAME_FIRST, contacts.NAME_MIDDLE, contacts.NAME_LAST, orders.CONTACT_ID, orders.ORG_ID) where (^{orders.}^.CONTACT_ID = ^{contacts.}^.CONTACT_ID and ^{orders.}^.ORG_ID = ^{contacts.}^.ORG_ID) as virtrdf:Order-CONTACT_ID ; ecrm:contactName orders.CONTACT_NAME as virtrdf:Order-CONTACT_NAME ; ecrm:orderNo orders.ORDER_NO as virtrdf:Order-ORDER_NO ; ecrm:shipFirstName orders.SHIP_FNAME as virtrdf:Order-SHIP_FNAME ; ecrm:shipSecondName orders.SHIP_SNAME as virtrdf:Order-SHIP_SNAME ; ecrm:phoneNumber orders.PHONE_NUMBER as virtrdf:Order-PHONE_NUMBER ; ecrm:phoneExtension orders.PHONE_EXTENSION as virtrdf:Order-PHONE_EXTENSION ; ecrm:email orders.EMAIL as virtrdf:Order-EMAIL ; ecrm:shipCountry ecrm:Country(orders.SHIP_COUNTRY_NAME) as virtrdf:Order-SHIP_COUNTRY_NAME ; ecrm:shipCountryCode ecrm:Country (countries.COUNTRY_NAME) where (^{countries.}^.COUNTRY_NAME = ^{orders.}^.SHIP_COUNTRY_NAME) as virtrdf:Order-SHIP_COUNTRY_CODE ; ecrm:shipProvince orders.SHIP_PROVINCE as virtrdf:Order-SHIP_PROVINCE ; ecrm:shipCity orders.SHIP_CITY as virtrdf:Order-SHIP_CITY ; ecrm:dbpedia_shipCity ecrm:dbpedia_iri (orders.SHIP_CITY) as virtrdf:Order-SHIP_dbpedia_CITY ; ecrm:shipPostalCode orders.SHIP_POSTAL_CODE as virtrdf:Order-SHIP_POSTAL_CODE ; ecrm:shipAddress1 orders.SHIP_ADDRESS1 as virtrdf:Order-SHIP_ADDRESS1 ; ecrm:shipAddress2 orders.SHIP_ADDRESS2 as virtrdf:Order-SHIP_ADDRESS2 ; ecrm:salesRep orders.SALESREP as virtrdf:Order-SALESREP ; ecrm:orderDate orders.ORDER_DATE as virtrdf:Order-ORDER_DATE ; ecrm:orderValue orders.ORDER_VALUE as virtrdf:Order-ORDER_VALUE ; ecrm:refund orders.REFUND as virtrdf:Order-REFUND ; ecrm:year orders.YEAR as virtrdf:Order-YEAR ; ecrm:month orders.MONTH as virtrdf:Order-MONTH ; ecrm:quarter orders.QUARTER as virtrdf:Order-QUARTER ; ecrm:financialYear orders.FINANCIAL_YEAR as virtrdf:Order-FINANCIAL_YEAR ; ecrm:CONTACT_REL_ID orders.CONTACT_REL_ID as virtrdf:Order-CONTACT_REL_ID ; ecrm:COMPANY_REL_ID orders.COMPANY_REL_ID as virtrdf:Order-COMPANY_REL_ID . ... } . } . ;
Here is sample example of a script to include an additional table alias for a table:
alter quad storage virtrdf:DefaultQuadStorage : FROM isports_rdf.prs10_isports_rdf.VRef_Call as Ref_Call_tbl FROM isports_rdf.prs10_isports_rdf.VRef_Call as Ref_Call_tbl_1 : { : refcall:ref-call_iri (Ref_Call_tbl.Call_Num) a refcall:Ref-Call as virtrdf:ref-call_pk ; : refcall:has_parent refcall:ref-call_iri (Ref_Call_tbl_1.Call_Num) where ( ^{Ref_Call_tbl.}^.Parent = ^{Ref_Call_tbl_1.}^.Call_Num ) as virtrdf:Ref-Call_has_parent .
This demonstrates the way to self-join the table VRef_Call with itself. Like in SQL, are needed two different aliases for one table if you want to join it with itself.
use DB; GRANT SELECT ON TPCH.DBA.PARTSUPP TO "SPARQL"; GRANT SELECT ON TPCH.DBA.SUPPLIER TO "SPARQL"; GRANT SELECT ON TPCH.DBA.CUSTOMER TO "SPARQL"; GRANT SELECT ON TPCH.DBA.HISTORY TO "SPARQL"; GRANT SELECT ON TPCH.DBA.PART TO "SPARQL"; GRANT SELECT ON TPCH.DBA.LINEITEM TO "SPARQL"; GRANT SELECT ON TPCH.DBA.ORDERS TO "SPARQL"; GRANT SELECT ON TPCH.DBA.NATION TO "SPARQL"; GRANT SELECT ON TPCH.DBA.REGION TO "SPARQL"; SPARQL drop quad map virtrdf:TPCH ; SPARQL prefix tpch: <http://www.openlinksw.com/schemas/tpch#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> create iri class tpch:customer "http://^{URIQADefaultHost}^/tpch/customer/%U%d#this" (in custname varchar, in c_custkey integer not null) option (bijection, deref) . create iri class tpch:lineitem "http://^{URIQADefaultHost}^/tpch/lineitem/%d/%d#this" (in l_orderkey integer not null, in l_linenumber integer not null) option (bijection, deref) . create iri class tpch:nation "http://^{URIQADefaultHost}^/tpch/nation/%U%d#this" (in name varchar, in l_nationkey integer not null) option (bijection, deref) . create iri class tpch:order "http://^{URIQADefaultHost}^/tpch/order/%d#this" (in o_orderkey integer not null) option (bijection, deref) . create iri class tpch:part "http://^{URIQADefaultHost}^/tpch/part/%U%d#this" (in p_partname varchar, in p_partkey integer not null) option (bijection, deref) . create iri class tpch:partsupp "http://^{URIQADefaultHost}^/tpch/partsupp/%d/%d#this" (in ps_partkey integer not null, in ps_suppkey integer not null) option (bijection, deref) . create iri class tpch:region "http://^{URIQADefaultHost}^/tpch/region/%U%d#this" (in name varchar, in r_regionkey integer not null) option (bijection, deref) . create iri class tpch:supplier "http://^{URIQADefaultHost}^/tpch/supplier/%U%d#this" (in name varchar, in s_supplierkey integer not null) option (bijection, deref) . ; SPARQL prefix tpch: <http://www.openlinksw.com/schemas/tpch#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> alter quad storage virtrdf:DefaultQuadStorage FROM TPCH.DBA.LINEITEM as lineitems FROM TPCH.DBA.CUSTOMER as customers FROM TPCH.DBA.NATION as nations FROM TPCH.DBA.ORDERS as orders FROM TPCH.DBA.PART as parts FROM TPCH.DBA.PARTSUPP as partsupps FROM TPCH.DBA.REGION as regions FROM TPCH.DBA.SUPPLIER as suppliers where (^{suppliers.}^.S_NATIONKEY = ^{nations.}^.N_NATIONKEY) where (^{customers.}^.C_NATIONKEY = ^{nations.}^.N_NATIONKEY) { create virtrdf:TPCH as graph iri ("http://^{URIQADefaultHost}^/tpch") option (exclusive) { # Customers tpch:customer (customers.C_NAME, customers.C_CUSTKEY) a tpch:customer as virtrdf:customer-tpch-type ; a foaf:Organization as virtrdf:customer-foaf-type ; tpch:custkey customers.C_CUSTKEY as virtrdf:customer-c_custkey ; foaf:name customers.C_NAME as virtrdf:customer-foaf_name ; tpch:companyName customers.C_NAME as virtrdf:customer-c_name ; tpch:has_nation tpch:nation (nations.N_NAME, customers.C_NATIONKEY) as virtrdf:customer-c_nationkey ; tpch:address customers.C_ADDRESS as virtrdf:customer-c_address ; foaf:phone customers.C_PHONE as virtrdf:customer-foaf_phone ; tpch:phone customers.C_PHONE as virtrdf:customer-phone ; tpch:acctbal customers.C_ACCTBAL as virtrdf:customer-acctbal ; tpch:mktsegment customers.C_MKTSEGMENT as virtrdf:customer-c_mktsegment ; tpch:comment customers.C_COMMENT as virtrdf:customer-c_comment . # Nations tpch:nation (nations.N_NAME, customers.C_NATIONKEY) tpch:nation_of tpch:customer (customers.C_NAME, customers.C_CUSTKEY) as virtrdf:customer-nation_of . tpch:lineitem (lineitems.L_ORDERKEY, lineitems.L_LINENUMBER) a tpch:lineitem as virtrdf:lineitem-lineitems ; tpch:has_order tpch:order (lineitems.L_ORDERKEY) as virtrdf:lineitem-l_orderkey ; tpch:has_part tpch:part (parts.P_NAME, lineitems.L_PARTKEY) where (^{parts.}^.P_PARTKEY = ^{lineitems.}^.L_PARTKEY) as virtrdf:lineitem-l_partkey ; tpch:has_supplier tpch:supplier (suppliers.S_NAME, lineitems.L_SUPPKEY) where (^{suppliers.}^.S_SUPPKEY = ^{lineitems.}^.L_SUPPKEY) as virtrdf:lineitem-l_suppkey ; tpch:linenumber lineitems.L_LINENUMBER as virtrdf:lineitem-l_linenumber ; tpch:linequantity lineitems.L_QUANTITY as virtrdf:lineitem-l_linequantity ; tpch:lineextendedprice lineitems.L_EXTENDEDPRICE as virtrdf:lineitem-l_lineextendedprice ; tpch:linediscount lineitems.L_DISCOUNT as virtrdf:lineitem-l_linediscount ; tpch:linetax lineitems.L_TAX as virtrdf:lineitem-l_linetax ; tpch:returnflag lineitems.L_RETURNFLAG as virtrdf:lineitem-l_returnflag ; tpch:linestatus lineitems.L_LINESTATUS as virtrdf:lineitem-l_linestatus ; tpch:shipdate lineitems.L_SHIPDATE as virtrdf:lineitem-l_shipdate ; tpch:commitdate lineitems.L_COMMITDATE as virtrdf:lineitem-l_commitdate ; tpch:receiptdate lineitems.L_RECEIPTDATE as virtrdf:lineitem-l_receiptdate ; tpch:shipinstruct lineitems.L_SHIPINSTRUCT as virtrdf:lineitem-l_shipinstruct ; tpch:shipmode lineitems.L_SHIPMODE as virtrdf:lineitem-l_shipmode ; tpch:comment lineitems.L_COMMENT as virtrdf:lineitem-l_comment . tpch:part (parts.P_NAME, lineitems.L_PARTKEY) tpch:part_of tpch:lineitem (lineitems.L_ORDERKEY, lineitems.L_LINENUMBER) where (^{parts.}^.P_PARTKEY = ^{lineitems.}^.L_PARTKEY) as virtrdf:lineitem-part_of . tpch:order (lineitems.L_ORDERKEY) tpch:order_of tpch:lineitem (lineitems.L_ORDERKEY, lineitems.L_LINENUMBER) as virtrdf:lineitem-order_of . tpch:supplier (suppliers.S_NAME, lineitems.L_SUPPKEY) tpch:supplier_of tpch:lineitem (lineitems.L_ORDERKEY, lineitems.L_LINENUMBER) where (^{suppliers.}^.S_SUPPKEY = ^{lineitems.}^.L_SUPPKEY) as virtrdf:lineitem-supplier_of . # Nation tpch:nation (nations.N_NAME, nations.N_NATIONKEY) a tpch:nation as virtrdf:nation-nations ; tpch:name nations.N_NAME as virtrdf:nation-n_name ; tpch:has_region tpch:region (regions.R_NAME, nations.N_REGIONKEY) where (^{regions.}^.R_REGIONKEY = ^{nations.}^.N_REGIONKEY) as virtrdf:nation-n_regionkey ; tpch:comment nations.N_COMMENT as virtrdf:nation-n_comment . tpch:region (regions.R_NAME, nations.N_REGIONKEY) tpch:region_of tpch:nation (nations.N_NAME, nations.N_NATIONKEY) where (^{regions.}^.R_REGIONKEY = ^{nations.}^.N_REGIONKEY) as virtrdf:nation-region_of . # Order tpch:order (orders.O_ORDERKEY) a tpch:order as virtrdf:order-orders ; tpch:orderkey orders.O_ORDERKEY as virtrdf:order-o_orderkey ; tpch:has_customer tpch:customer (customers.C_NAME, orders.O_CUSTKEY) where (^{orders.}^.O_CUSTKEY = ^{customers.}^.C_CUSTKEY) as virtrdf:order-o_custkey ; tpch:orderstatus orders.O_ORDERSTATUS as virtrdf:order-o_orderstatus ; tpch:ordertotalprice orders.O_TOTALPRICE as virtrdf:order-o_totalprice ; tpch:orderdate orders.O_ORDERDATE as virtrdf:order-o_orderdate ; tpch:orderpriority orders.O_ORDERPRIORITY as virtrdf:order-o_orderpriority ; tpch:clerk orders.O_CLERK as virtrdf:order-o_clerk ; tpch:shippriority orders.O_SHIPPRIORITY as virtrdf:order-o_shippriority ; tpch:comment orders.O_COMMENT as virtrdf:order-o_comment . tpch:customer (customers.C_CUSTKEY, orders.O_CUSTKEY) tpch:customer_of tpch:order (orders.O_ORDERKEY) where (^{orders.}^.O_CUSTKEY = ^{customers.}^.C_CUSTKEY) as virtrdf:order-customer_of . # Part tpch:part (parts.P_NAME, parts.P_PARTKEY) a tpch:part as virtrdf:part-parts ; tpch:partkey parts.P_PARTKEY as virtrdf:part-p_partkey ; tpch:name parts.P_NAME as virtrdf:part-p_name ; tpch:mfgr parts.P_MFGR as virtrdf:part-p_mfgr ; tpch:brand parts.P_BRAND as virtrdf:part-p_brand ; tpch:type parts.P_TYPE as virtrdf:part-p_type ; tpch:size parts.P_SIZE as virtrdf:part-p_size ; tpch:container parts.P_CONTAINER as virtrdf:part-p_container ; tpch:comment parts.P_COMMENT as virtrdf:part-p_comment . # Partsupp tpch:partsupp (partsupps.PS_PARTKEY, partsupps.PS_SUPPKEY) a tpch:partsupp as virtrdf:partsupp-partsupps ; tpch:has_part tpch:part (parts.P_NAME, partsupps.PS_PARTKEY) where (^{parts.}^.P_PARTKEY = ^{partsupps.}^.PS_PARTKEY) as virtrdf:partsupp-ps_partkey ; tpch:has_supplier tpch:supplier (suppliers.S_NAME, partsupps.PS_SUPPKEY) where (^{suppliers.}^.S_SUPPKEY = ^{partsupps.}^.PS_SUPPKEY) as virtrdf:partsupp-ps_suppkey ; tpch:availqty partsupps.PS_AVAILQTY as virtrdf:partsupp-ps_availqty ; tpch:supplycost partsupps.PS_SUPPLYCOST as virtrdf:partsupp-ps_supplycost ; tpch:comment partsupps.PS_COMMENT as virtrdf:partsupp-ps_comment . tpch:part (parts.P_NAME, partsupps.PS_PARTKEY) tpch:part_of tpch:partsupp (partsupps.PS_PARTKEY, partsupps.PS_SUPPKEY) where (^{parts.}^.P_PARTKEY = ^{partsupps.}^.PS_PARTKEY) as virtrdf:partsupp-part_of . tpch:supplier (suppliers.S_NAME, partsupps.PS_SUPPKEY) tpch:supplier_of tpch:partsupp (partsupps.PS_PARTKEY, partsupps.PS_SUPPKEY) where (^{suppliers.}^.S_SUPPKEY = ^{partsupps.}^.PS_SUPPKEY) as virtrdf:partsupp-supplier_of . # Region tpch:region (regions.R_NAME, regions.R_REGIONKEY) a tpch:region as virtrdf:region-regions ; tpch:name regions.R_NAME as virtrdf:region-r_name ; tpch:comment regions.R_COMMENT as virtrdf:region-r_comment . # Supplier tpch:supplier (suppliers.S_NAME, suppliers.S_SUPPKEY) a tpch:supplier as virtrdf:supplier-suppliers ; tpch:name suppliers.S_NAME as virtrdf:supplier-s_name ; tpch:address suppliers.S_ADDRESS as virtrdf:supplier-s_address ; tpch:has_nation tpch:nation (nations.N_NAME, suppliers.S_NATIONKEY) where (^{nations.}^.N_NATIONKEY = ^{suppliers.}^.S_NATIONKEY) as virtrdf:supplier-s_nationkey ; foaf:phone suppliers.S_PHONE as virtrdf:supplier-foaf_phone ; tpch:phone suppliers.S_PHONE as virtrdf:supplier-s_phone ; tpch:acctbal suppliers.S_ACCTBAL as virtrdf:supplier-s_acctbal ; tpch:comment suppliers.S_COMMENT as virtrdf:supplier-s_comment . tpch:nation (nations.N_NAME, suppliers.S_NATIONKEY) tpch:nation_of tpch:supplier (suppliers.S_NAME, suppliers.S_SUPPKEY) where (^{nations.}^.N_NATIONKEY = ^{suppliers.}^.S_NATIONKEY) as virtrdf:supplier-nation_of . } . } . ; DELETE FROM db.dba.url_rewrite_rule_list WHERE urrl_list like 'tpch_rule%'; DELETE FROM db.dba.url_rewrite_rule WHERE urr_rule like 'tpch_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tpch_rule2', 1, '([^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%23this%%3E+%%3Fp+%%3Fo+}+FROM+%%3Chttp%%3A//^{URIQADefaultHost}^/tpch%%3E+WHERE+{+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%23this%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tpch_rule1', 1, '([^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s%%23this', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tpch_rule3', 1, '(/[^#]*)/\x24', vector('path'), 1, '%s', vector('path'), null, null, 0, null ); create procedure DB.DBA.REMOVE_TPCH_RDF_DET() { declare colid int; colid := DAV_SEARCH_ID('/DAV/home/demo/tpch', 'C'); if (colid < 0) return; update WS.WS.SYS_DAV_COL set COL_DET=null where COL_ID = colid; } ; DB.DBA.REMOVE_TPCH_RDF_DET(); drop procedure DB.DBA.REMOVE_TPCH_RDF_DET; create procedure DB.DBA.TPCH_MAKE_RDF_DET() { declare uriqa_str varchar; uriqa_str := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); uriqa_str := 'http://' || uriqa_str || '/tpch'; DB.DBA."RDFData_MAKE_DET_COL" ('/DAV/home/demo/tpch/RDFData/', uriqa_str, NULL); VHOST_REMOVE (lpath=>'/tpch/data/rdf'); DB.DBA.VHOST_DEFINE (lpath=>'/tpch/data/rdf', ppath=>'/DAV/home/demo/tpch/RDFData/All/', is_dav=>1, vsp_user=>'dba'); } ; DB.DBA.TPCH_MAKE_RDF_DET(); drop procedure DB.DBA.TPCH_MAKE_RDF_DET; create procedure DB.DBA.TPCH_DET_REF (in par varchar, in fmt varchar, in val varchar) { declare res, iri any; declare uriqa_str varchar; uriqa_str := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); uriqa_str := 'http://' || uriqa_str || '/tpch'; iri := uriqa_str || val; res := sprintf ('iid (%d).rdf', iri_id_num (iri_to_id (iri))); return sprintf (fmt, res); } ; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('tpch_rdf', 1, '/tpch/(.*)', vector('path'), 1, '/tpch/data/rdf/%U', vector('path'), 'DB.DBA.TPCH_DET_REF', 'application/rdf.xml', 2, 303); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'tpch_rule_list1', 1, vector ( 'tpch_rule1', 'tpch_rule2', 'tpch_rule3', 'tpch_rdf' )); DB.DBA.VHOST_REMOVE (lpath=>'/tpch'); DB.DBA.VHOST_DEFINE (lpath=>'/tpch', ppath=>'/DAV/home/demo/tpch/', vsp_user=>'dba', is_dav=>1, is_brws=>0, opts=>vector ('url_rewrite', 'tpch_rule_list1')); DB.DBA.VHOST_REMOVE (lpath=>'/tpch/linkeddata'); DB.DBA.VHOST_DEFINE (lpath=>'/tpch/linkeddata', ppath=>'/DAV/home/demo/tpch/', vsp_user=>'dba', is_dav=>1, is_brws=>1);
Please load ~\binsrc\dav\DET_RDFData.sql before loadding this script (tpc-d has no vad to do this automatic)
use DB; create procedure DB.DBA.exec_no_error (in expr varchar) { declare state, message, meta, result any; exec(expr, state, message, vector(), 0, meta, result); } ; DB.DBA.exec_no_error('GRANT \"SPARQL_UPDATE\" TO \"SPARQL\"') ; GRANT SELECT ON tpcd.DBA.partsupp TO "SPARQL"; GRANT SELECT ON tpcd.DBA.supplier TO "SPARQL"; GRANT SELECT ON tpcd.DBA.customer TO "SPARQL"; GRANT SELECT ON tpcd.DBA.history TO "SPARQL"; GRANT SELECT ON tpcd.DBA.part TO "SPARQL"; GRANT SELECT ON tpcd.DBA.lineitem TO "SPARQL"; GRANT SELECT ON tpcd.DBA.orders TO "SPARQL"; GRANT SELECT ON tpcd.DBA.nation TO "SPARQL"; GRANT SELECT ON tpcd.DBA.region TO "SPARQL"; --SPARQL --prefix tpcd: <http://demo.openlinksw.com/schemas/tpcd#> --prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> --prefix sioc: <http://rdfs.org/sioc/ns#> --prefix foaf: <http://xmlns.com/foaf/0.1/> --prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> --drop quad map graph iri("http://^{URIQADefaultHost}^/tpcd") . --; SPARQL prefix tpcd: <http://demo.openlinksw.com/schemas/tpcd#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> drop silent quad map virtrdf:TpcdDemo . ; SPARQL prefix tpcd: <http://demo.openlinksw.com/schemas/tpcd#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> create iri class tpcd:customer "http://^{URIQADefaultHost}^/tpcd/customer/%d#this" (in c_custkey integer not null) . create iri class tpcd:lineitem "http://^{URIQADefaultHost}^/tpcd/lineitem/%d/%d#this" (in l_orderkey integer not null, in l_linenumber integer not null) . create iri class tpcd:nation "http://^{URIQADefaultHost}^/tpcd/nation/%d#this" (in l_nationkey integer not null) . create iri class tpcd:order "http://^{URIQADefaultHost}^/tpcd/order/%d#this" (in o_orderkey integer not null) . create iri class tpcd:part "http://^{URIQADefaultHost}^/tpcd/part/%d#this" (in p_partkey integer not null) . create iri class tpcd:partsupp "http://^{URIQADefaultHost}^/tpcd/partsupp/%d/%d#this" (in ps_partkey integer not null, in ps_suppkey integer not null) . create iri class tpcd:region "http://^{URIQADefaultHost}^/tpcd/region/%d#this" (in r_regionkey integer not null) . create iri class tpcd:supplier "http://^{URIQADefaultHost}^/tpcd/supplier/%d#this" (in s_supplierkey integer not null) . ; SPARQL prefix tpcd: <http://demo.openlinksw.com/schemas/tpcd#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> alter quad storage virtrdf:DefaultQuadStorage from tpcd.DBA.lineitem as lineitems from tpcd.DBA.customer as customers from tpcd.DBA.nation as nations from tpcd.DBA.orders as orders from tpcd.DBA.part as parts from tpcd.DBA.partsupp as partsupps from tpcd.DBA.region as regions from tpcd.DBA.supplier as suppliers where (^{suppliers.}^.s_nationkey = ^{nations.}^.n_nationkey) where (^{customers.}^.c_nationkey = ^{nations.}^.n_nationkey) { create virtrdf:TpcdDemo as graph iri ("http://^{URIQADefaultHost}^/tpcd") option (exclusive) { # Customers tpcd:customer (customers.c_custkey) a tpcd:customer as virtrdf:tpcdcustomer-type ; a foaf:Organization as virtrdf:tpcdcustomer-foaf-type ; tpcd:custkey customers.c_custkey as virtrdf:tpcdcustomer-c_custkey ; foaf:name customers.c_name as virtrdf:tpcdcustomer-foaf_name ; tpcd:companyName customers.c_name as virtrdf:tpcdcustomer-c_name ; tpcd:has_nation tpcd:nation (customers.c_nationkey) as virtrdf:tpcdcustomer-c_nationkey ; tpcd:address customers.c_address as virtrdf:tpcdcustomer-c_address ; foaf:phone customers.c_phone as virtrdf:tpcdcustomer-foaf_phone ; tpcd:phone customers.c_phone as virtrdf:tpcdcustomer-phone ; tpcd:acctbal customers.c_acctbal as virtrdf:tpcdcustomer-acctbal ; tpcd:mktsegment customers.c_mktsegment as virtrdf:tpcdcustomer-c_mktsegment ; tpcd:comment customers.c_comment as virtrdf:tpcdcustomer-c_comment . # Nations tpcd:nation (customers.c_nationkey) tpcd:nation_of tpcd:customer (customers.c_custkey) as virtrdf:tpcdcustomer-nation_of . # Lineitems tpcd:lineitem (lineitems.l_orderkey, lineitems.l_linenumber) a tpcd:lineitem as virtrdf:tpcdlineitem-lineitems ; tpcd:has_order tpcd:order (lineitems.l_orderkey) as virtrdf:tpcdlineitem-l_orderkey ; tpcd:has_part tpcd:part (lineitems.l_partkey) as virtrdf:tpcdlineitem-l_partkey ; tpcd:has_supplier tpcd:supplier (lineitems.l_suppkey) as virtrdf:tpcdlineitem-l_suppkey ; tpcd:linenumber lineitems.l_linenumber as virtrdf:tpcdlineitem-l_linenumber ; tpcd:linequantity lineitems.l_quantity as virtrdf:tpcdlineitem-l_linequantity ; tpcd:lineextendedprice lineitems.l_extendedprice as virtrdf:tpcdlineitem-l_lineextendedprice ; tpcd:linediscount lineitems.l_discount as virtrdf:tpcdlineitem-l_linediscount ; tpcd:linetax lineitems.l_tax as virtrdf:tpcdlineitem-l_linetax ; tpcd:returnflag lineitems.l_returnflag as virtrdf:tpcdlineitem-l_returnflag ; tpcd:linestatus lineitems.l_linestatus as virtrdf:tpcdlineitem-l_linestatus ; tpcd:shipdate lineitems.l_shipdate as virtrdf:tpcdlineitem-l_shipdate ; tpcd:commitdate lineitems.l_commitdate as virtrdf:tpcdlineitem-l_commitdate ; tpcd:receiptdate lineitems.l_receiptdate as virtrdf:tpcdlineitem-l_receiptdate ; tpcd:shipinstruct lineitems.l_shipinstruct as virtrdf:tpcdlineitem-l_shipinstruct ; tpcd:shipmode lineitems.l_shipmode as virtrdf:tpcdlineitem-l_shipmode ; tpcd:comment lineitems.l_comment as virtrdf:tpcdlineitem-l_comment . tpcd:part (lineitems.l_partkey) tpcd:part_of tpcd:lineitem (lineitems.l_orderkey, lineitems.l_linenumber) as virtrdf:tpcdlineitem-part_of . tpcd:order (lineitems.l_orderkey) tpcd:order_of tpcd:lineitem (lineitems.l_orderkey, lineitems.l_linenumber) as virtrdf:tpcdlineitem-order_of . tpcd:supplier (lineitems.l_suppkey) tpcd:supplier_of tpcd:lineitem (lineitems.l_orderkey, lineitems.l_linenumber) as virtrdf:tpcdlineitem-supplier_of . # Nation tpcd:nation (nations.n_nationkey) a tpcd:nation as virtrdf:tpcdnation-nations ; tpcd:name nations.n_name as virtrdf:tpcdnation-n_name ; tpcd:has_region tpcd:region (nations.n_regionkey) as virtrdf:tpcdnation-n_regionkey ; tpcd:comment nations.n_comment as virtrdf:tpcdnation-n_comment . tpcd:region (nations.n_regionkey) tpcd:region_of tpcd:nation (nations.n_nationkey) as virtrdf:tpcdnation-region_of . # Order tpcd:order (orders.o_orderkey) a tpcd:order as virtrdf:tpcdorder-orders ; tpcd:orderkey orders.o_orderkey as virtrdf:tpcdorder-o_orderkey ; tpcd:has_customer tpcd:customer (orders.o_custkey) as virtrdf:tpcdorder-o_custkey ; tpcd:orderstatus orders.o_orderstatus as virtrdf:tpcdorder-o_orderstatus ; tpcd:ordertotalprice orders.o_totalprice as virtrdf:tpcdorder-o_totalprice ; tpcd:orderdate orders.o_orderdate as virtrdf:tpcdorder-o_orderdate ; tpcd:orderpriority orders.o_orderpriority as virtrdf:tpcdorder-o_orderpriority ; tpcd:clerk orders.o_clerk as virtrdf:tpcdorder-o_clerk ; tpcd:shippriority orders.o_shippriority as virtrdf:tpcdorder-o_shippriority ; tpcd:comment orders.o_comment as virtrdf:tpcdorder-o_comment . tpcd:customer (orders.o_custkey) tpcd:customer_of tpcd:order (orders.o_orderkey) as virtrdf:tpcdorder-customer_of . # Part tpcd:part (parts.p_partkey) a tpcd:part as virtrdf:tpcdpart-parts ; tpcd:partkey parts.p_partkey as virtrdf:tpcdpart-p_partkey ; tpcd:name parts.p_name as virtrdf:tpcdpart-p_name ; tpcd:mfgr parts.p_mfgr as virtrdf:tpcdpart-p_mfgr ; tpcd:brand parts.p_brand as virtrdf:tpcdpart-p_brand ; tpcd:type parts.p_type as virtrdf:tpcdpart-p_type ; tpcd:size parts.p_size as virtrdf:tpcdpart-p_size ; tpcd:container parts.p_container as virtrdf:tpcdpart-p_container ; tpcd:comment parts.p_comment as virtrdf:tpcdpart-p_comment . # Partsupp tpcd:partsupp (partsupps.ps_partkey, partsupps.ps_suppkey) a tpcd:partsupp as virtrdf:tpcdpartsupp-partsupps ; tpcd:has_part tpcd:part (partsupps.ps_partkey) as virtrdf:tpcdpartsupp-ps_partkey ; tpcd:has_supplier tpcd:supplier (partsupps.ps_suppkey) as virtrdf:tpcdpartsupp-ps_suppkey ; tpcd:availqty partsupps.ps_availqty as virtrdf:tpcdpartsupp-ps_availqty ; tpcd:supplycost partsupps.ps_supplycost as virtrdf:tpcdpartsupp-ps_supplycost ; tpcd:comment partsupps.ps_comment as virtrdf:tpcdpartsupp-ps_comment . tpcd:part (partsupps.ps_partkey) tpcd:part_of tpcd:partsupp (partsupps.ps_partkey, partsupps.ps_suppkey) as virtrdf:tpcdpartsupp-part_of . tpcd:supplier (partsupps.ps_suppkey) tpcd:supplier_of tpcd:partsupp (partsupps.ps_partkey, partsupps.ps_suppkey) as virtrdf:tpcdpartsupp-supplier_of . # Region tpcd:region (regions.r_regionkey) a tpcd:region as virtrdf:tpcdregion-regions ; tpcd:name regions.r_name as virtrdf:tpcdregion-r_name ; tpcd:comment regions.r_comment as virtrdf:tpcdregion-r_comment . # Supplier tpcd:supplier (suppliers.s_suppkey) a tpcd:supplier as virtrdf:tpcdsupplier-suppliers ; tpcd:name suppliers.s_name as virtrdf:tpcdsupplier-s_name ; tpcd:address suppliers.s_address as virtrdf:tpcdsupplier-s_address ; tpcd:has_nation tpcd:nation (suppliers.s_nationkey) as virtrdf:tpcdsupplier-s_nationkey ; foaf:phone suppliers.s_phone as virtrdf:tpcdsupplier-foaf_phone ; tpcd:phone suppliers.s_phone as virtrdf:tpcdsupplier-s_phone ; tpcd:acctbal suppliers.s_acctbal as virtrdf:tpcdsupplier-s_acctbal ; tpcd:comment suppliers.s_comment as virtrdf:tpcdsupplier-s_comment . tpcd:nation (suppliers.s_nationkey) tpcd:nation_of tpcd:supplier (suppliers.s_suppkey) as virtrdf:tpcdsupplier-nation_of . } } ; create procedure tcpd_rdf_doc (in path varchar) { declare r any; r := regexp_match ('[^/]*\x24', path); return r||'#this'; }; create procedure tcpd_html_doc (in path varchar) { declare r any; r := regexp_match ('[^/]*#', path); return subseq (r, 0, length (r)-1); }; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tcpd_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%23this%%3E+%%3Fp+%%3Fo+}+FROM+%%3Chttp%%3A//^{URIQADefaultHost}^/tpcd%%3E+WHERE+{+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%23this%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tcpd_rule1', 1, '(/[^#]*)', vector('path'), 1, '/rdfbrowser/index.html?uri=http%%3A//^{URIQADefaultHost}^%U%%23this', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tcpd_rule3', 1, '(/[^#]*)/\x24', vector('path'), 1, '%s', vector('path'), null, null, 0, null ); DB.DBA."RDFData_MAKE_DET_COL" ('/DAV/home/tpcd/RDFData/', 'http://^{URIQADefaultHost}^/tpcd', NULL); VHOST_REMOVE (lpath=>'/tpcd/data/rdf'); DB.DBA.VHOST_DEFINE (lpath=>'/tpcd/data/rdf', ppath=>'/DAV/home/tpcd/RDFData/All/', is_dav=>1, vsp_user=>'dba'); -- procedure to convert path to DET resource name create procedure DB.DBA.TPCD_DET_REF (in par varchar, in fmt varchar, in val varchar) { declare res, iri any; iri := 'http://^{URIQADefaultHost}^/tpcd' || val; res := sprintf ('iid (%d).rdf', iri_id_num (iri_to_id (iri))); return sprintf (fmt, res); } ; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('tpcd_rdf', 1, '/tpcd/(.*)', vector('path'), 1, '/tpcd/data/rdf/%U', vector('path'), 'DB.DBA.TPCD_DET_REF', 'application/rdf.xml', 2, 303); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'tpcd_rule_list1', 1, vector ( 'tcpd_rule1', 'tcpd_rule2', 'tcpd_rule3', 'tpcd_rdf' )); VHOST_REMOVE (lpath=>'/tpcd'); DB.DBA.VHOST_DEFINE (lpath=>'/tpcd', ppath=>'/DAV/home/', vsp_user=>'dba', is_dav=>1, def_page=>'sfront.vspx', is_brws=>0, opts=>vector ('url_rewrite', 'tpcd_rule_list1')); create procedure DB.DBA.LOAD_TPCD_ONTOLOGY_FROM_DAV() { declare content, urihost varchar; select cast (RES_CONTENT as varchar) into content from WS.WS.SYS_DAV_RES where RES_FULL_PATH = '/DAV/VAD/tpcd/tpcd.owl'; DB.DBA.RDF_LOAD_RDFXML (content, 'http://demo.openlinksw.com/schemas/tpcd#', 'http://demo.openlinksw.com/schemas/TPCDOntology/1.0/'); urihost := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); if (urihost = 'demo.openlinksw.com') { DB.DBA.VHOST_REMOVE (lpath=>'/schemas/tpcd'); DB.DBA.VHOST_DEFINE (lpath=>'/schemas/tpcd', ppath=>'/DAV/VAD/tpcd/tpcd.owl', vsp_user=>'dba', is_dav=>1, is_brws=>0); } } ; DB.DBA.LOAD_TPCD_ONTOLOGY_FROM_DAV() ; drop procedure DB.DBA.LOAD_TPCD_ONTOLOGY_FROM_DAV ; XML_SET_NS_DECL ('virt-tpcd', 'http://demo.openlinksw.com/schemas/tpcd#', 2) ;
use DB ; SPARQL drop quad map virtrdf:ThaliaDemo ; create procedure DB.DBA.SPARQL_THALIA_RUN (in txt varchar) { declare REPORT, stat, msg, sqltext varchar; declare metas, rowset any; result_names (REPORT); sqltext := string_output_string (sparql_to_sql_text (txt)); stat := '00000'; msg := ''; rowset := null; exec (sqltext, stat, msg, vector (), 1000, metas, rowset); } ; create procedure DB.DBA.exec_no_error(in expr varchar) { declare state, message, meta, result any; exec(expr, state, message, vector(), 0, meta, result); } ; DB.DBA.exec_no_error('drop View thalia.Demo.asu_v'); DB.DBA.exec_no_error('create View thalia.Demo.asu_v as select left(Title,3) code,* from thalia.Demo.asu'); DB.DBA.exec_no_error('drop View thalia.Demo.gatech_v'); DB.DBA.exec_no_error('create View thalia.Demo.gatech_v as select *, Room||\' \'||Building Place from thalia.Demo.gatech'); DB.DBA.SPARQL_THALIA_RUN('drop quad map graph iri("http://^{URIQADefaultHost}^/Thalia") . ') ; GRANT SELECT ON thalia.Demo.asu TO "SPARQL" ; GRANT SELECT ON thalia.Demo.asu_v TO "SPARQL" ; GRANT SELECT ON thalia.Demo.brown TO "SPARQL" ; GRANT SELECT ON thalia.Demo.cmu TO "SPARQL" ; GRANT SELECT ON thalia.Demo.gatech TO "SPARQL" ; GRANT SELECT ON thalia.Demo.gatech_v TO "SPARQL" ; GRANT SELECT ON thalia.Demo.toronto TO "SPARQL" ; GRANT SELECT ON thalia.Demo.ucsd TO "SPARQL" ; GRANT SELECT ON thalia.Demo.umd TO "SPARQL" ; DB.DBA.SPARQL_THALIA_RUN('drop quad map graph iri("http://^{URIQADefaultHost}^/thalia") . '); DB.DBA.SPARQL_THALIA_RUN('drop quad map virtrdf:ThaliaDemo . '); DB.DBA.SPARQL_THALIA_RUN(' prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix xsd: <http://www.w3.org/2001/XMLSchema#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix owl: <http://www.w3.org/2002/07/owl#> prefix dc: <http://purl.org/dc/elements/1.1/> prefix time: <http://www.w3.org/2006/time#> prefix event: <http://purl.org/NET/c4dm/event.owl#> prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix skos: <http://www.w3.org/2004/02/skos/core#> prefix th: <http://demo.openlinksw.com/schemas/thalia#> create iri class th:Asu "http://^{URIQADefaultHost}^/thalia/asu/course/%U#this" (in code varchar not null) . create iri class th:Brown "http://^{URIQADefaultHost}^/thalia/brown/course/%U#this" (in Code varchar not null) . create iri class th:BrownInstructor "http://^{URIQADefaultHost}^/thalia/brown/instructor/%U#this" (in Code varchar not null) . create iri class th:BrownLecture "http://^{URIQADefaultHost}^/thalia/brown/lecture/%U#this" (in Code varchar not null) . create iri class th:BrownPlace "http://^{URIQADefaultHost}^/thalia/brown/place/%U#this" (in Code varchar not null) . create iri class th:Cmu "http://^{URIQADefaultHost}^/thalia/cmu/course/%U/%U#this" (in Code varchar not null, in Sec varchar) . create iri class th:CmuInstructor "http://^{URIQADefaultHost}^/thalia/cmu/instructor/%U/%U#this" (in Code varchar not null, in Sec varchar) . create iri class th:CmuLecture "http://^{URIQADefaultHost}^/thalia/cmu/lecture/%U/%U#this" (in Code varchar not null, in Sec varchar) . create iri class th:CmuPlace "http://^{URIQADefaultHost}^/thalia/cmu/place/%U/%U#this" (in Code varchar not null, in Sec varchar) . create iri class th:CmuEventTime "http://^{URIQADefaultHost}^/thalia/cmu/eventtime/%U/%U#this" (in Code varchar not null, in Sec varchar) . create iri class th:CmuDatetime "http://^{URIQADefaultHost}^/thalia/cmu/datetime/%U/%U#this" (in Code varchar not null, in Sec varchar) . create iri class th:Gatech "http://^{URIQADefaultHost}^/thalia/gatech/course/%U/%d/%U#this" (in Department varchar, in Code integer, in Section varchar) . create iri class th:GatechInstructor "http://^{URIQADefaultHost}^/thalia/gatech/instructor/%U/%d/%U#this" (in Department varchar, in Code integer, in Section varchar) . create iri class th:GatechLecture "http://^{URIQADefaultHost}^/thalia/gatech/lecture/%U/%d/%U#this" (in Department varchar, in Code integer, in Section varchar) . create iri class th:GatechEventTime "http://^{URIQADefaultHost}^/thalia/gatech/eventtime/%U/%d/%U#this" (in Department varchar, in Code integer, in Section varchar) . create iri class th:GatechDatetime "http://^{URIQADefaultHost}^/thalia/gatech/datetime/%U/%d/%U#this" (in Department varchar, in Code integer, in Section varchar) . create iri class th:GatechPlace "http://^{URIQADefaultHost}^/thalia/gatech/place/%U/%d/%U#this" (in Department varchar, in Code integer, in Section varchar) . create iri class th:Toronto "http://^{URIQADefaultHost}^/thalia/toronto/course/%U#this" (in No_ varchar) . create iri class th:TorontoInstructor "http://^{URIQADefaultHost}^/thalia/toronto/instructor/%U#this" (in No_ varchar) . create iri class th:TorontoLecture "http://^{URIQADefaultHost}^/thalia/toronto/lecture/%U#this" (in No_ varchar) . create iri class th:TorontoPlace "http://^{URIQADefaultHost}^/thalia/toronto/place/%U#this" (in No_ varchar) . create iri class th:Ucsd "http://^{URIQADefaultHost}^/thalia/ucsd/course/%U#this" (in Number varchar) . create iri class th:UcsdInstructor1 "http://^{URIQADefaultHost}^/thalia/ucsd/instructor1/%U#this" (in Number varchar) . create iri class th:UcsdInstructor2 "http://^{URIQADefaultHost}^/thalia/ucsd/instructor2/%U#this" (in Number varchar) . create iri class th:UcsdInstructor3 "http://^{URIQADefaultHost}^/thalia/ucsd/instructor3/%U#this" (in Number varchar) . create iri class th:Umd "http://^{URIQADefaultHost}^/thalia/umd/course/%U#this" (in Code varchar) . create iri class th:UmdLecture "http://^{URIQADefaultHost}^/thalia/umd/lecture/%U#this" (in Code varchar) . create iri class th:UmdEventTime "http://^{URIQADefaultHost}^/thalia/umd/eventtime/%U#this" (in Code varchar) . create iri class th:UmdDatetime "http://^{URIQADefaultHost}^/thalia/umd/datetime/%U#this" (in Code varchar) . ') ; DB.DBA.SPARQL_THALIA_RUN('prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix xsd: <http://www.w3.org/2001/XMLSchema#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix owl: <http://www.w3.org/2002/07/owl#> prefix dc: <http://purl.org/dc/elements/1.1/> prefix time: <http://www.w3.org/2006/time#> prefix event: <http://purl.org/NET/c4dm/event.owl#> prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix skos: <http://www.w3.org/2004/02/skos/core#> prefix th: <http://demo.openlinksw.com/schemas/thalia#> alter quad storage virtrdf:DefaultQuadStorage from thalia.demo.asu_v as asus from thalia.demo.brown as browns from thalia.demo.cmu as cmus from thalia.demo.gatech_v as gatechs from thalia.demo.toronto as torontos from thalia.demo.ucsd as ucsds from thalia.demo.umd as umds { create virtrdf:ThaliaDemo as graph iri ("http://^{URIQADefaultHost}^/thalia") option (exclusive) { th:Asu (asus.code) a th:Course as virtrdf:Asu-Course ; dc:title asus.Title as virtrdf:Asu-Title ; dc:description asus.Description as virtrdf:Asu-Description ; rdfs:seeAlso asus.MoreInfoURL as virtrdf:Asu-MoreInfoURL ; th:forUniversity "http://purl.org/thalia/university/asu/university/asu" as virtrdf:Asu-University ; skos:subject "http://purl.org/subject/thalia/ComputerScience" as virtrdf:Asu-Subject . th:Brown (browns.Code) a th:Course as virtrdf:Brown-Course ; dc:title browns.Title as virtrdf:Brown-Title ; th:hasInstructor th:BrownInstructor (browns.Code) as virtrdf:Brown-hasInstructor ; th:hasLecture th:BrownLecture(browns.Code) as virtrdf:Brown-hasLecture ; th:forUniversity "http://purl.org/thalia/university/brown" as virtrdf:Brown-University ; skos:subject "http://purl.org/subject/thalia/ComputerScience" as virtrdf:Brown-Subject . th:BrownInstructor (browns.Code) a th:Instructor as virtrdf:Brown-Instructor ; dc:homepage browns.Instructor as virtrdf:Brown-Instructor-Homepage . th:BrownLecture (browns.Code) a event:Event as virtrdf:Brown-Lecture ; event:place th:BrownPlace(browns.Code) as virtrdf:Brown-hasPlace . th:BrownPlace (browns.Code) a geo:Point as virtrdf:Brown-Place; dc:title browns.Room as virtrdf:Brown-Room . th:Cmu (cmus.Code, cmus.Sec) a th:Course as virtrdf:Cmu-Course ; dc:title cmus.CourseTitle as virtrdf:Cmu-CourseTitle ; th:hasInstructor th:CmuInstructor (cmus.Code, cmus.Sec) as virtrdf:Cmu-hasInstructor ; th:hasLecture th:CmuLecture(cmus.Code, cmus.Sec) as virtrdf:Cmu-hasLecture ; th:hasUnits cmus.Units as virtrdf:Cmu-hasUnits ; th:forUniversity "http://purl.org/thalia/university/cmu" as virtrdf:Cmu-University ; skos:subject "http://purl.org/subject/thalia/ComputerScience" as virtrdf:Cmu-Subject . th:CmuInstructor (cmus.Code, cmus.Sec) a th:Instructor as virtrdf:Cmu-Instructor ; foaf:name cmus.Lecturer as virtrdf:Cmu-Lecturer . th:CmuLecture (cmus.Code, cmus.Sec) a event:Event as virtrdf:Cmu-Lecture ; event:time th:CmuEventTime(cmus.Code, cmus.Sec) as virtrdf:Cmu-hasEventTime ; event:place th:CmuPlace(cmus.Code, cmus.Sec) as virtrdf:Cmu-hasPlace . th:CmuPlace (cmus.Code, cmus.Sec) a geo:Point as virtrdf:Cmu-Place; dc:title cmus.Room as virtrdf:Cmu-Room . th:CmuEventTime (cmus.Code, cmus.Sec) a time:Interval as virtrdf:Cmu-EventTime; time:inDateTime th:CmuDatetime(cmus.Code, cmus.Sec) as virtrdf:Cmu-inDateTime . th:CmuDatetime (cmus.Code, cmus.Sec) a time:DateTimeDescription as virtrdf:Cmu-Datetime; time:dayOfWeek cmus.Day_ as virtrdf:Cmu-Day ; time:hour cmus.Time_ as virtrdf:Cmu-Time . th:Gatech (gatechs.Department, gatechs.Code, gatechs.Section) a th:Course as virtrdf:Gatech-Course ; dc:title gatechs.Title as virtrdf:Gatech-Title ; th:hasInstructor th:GatechInstructor(gatechs.Department, gatechs.Code, gatechs.Section) as virtrdf:Gatech-hasInstructor ; dc:description gatechs.Description as virtrdf:Gatech-Description ; th:hasLecture th:GatechLecture(gatechs.Department, gatechs.Code, gatechs.Section) as virtrdf:Gatech-hasLecture ; th:forUniversity "http://purl.org/thalia/university/gatech" as virtrdf:Gatech-University ; skos:subject "http://purl.org/subject/thalia/ComputerScience" as virtrdf:Gatech-Subject . th:GatechInstructor (gatechs.Department, gatechs.Code, gatechs.Section) a th:Instructor as virtrdf:Gatech-Instructor ; foaf:name gatechs.Instructor as virtrdf:Gatech-InstructorName . th:GatechLecture (gatechs.Department, gatechs.Code, gatechs.Section) a event:Event as virtrdf:Gatech-Lecture ; event:time th:GatechEventTime(gatechs.Department, gatechs.Code, gatechs.Section) as virtrdf:Gatech-hasEventTime ; event:place th:GatechPlace(gatechs.Department, gatechs.Code, gatechs.Section) as virtrdf:Gatech-hasPlace . th:GatechEventTime (gatechs.Department, gatechs.Code, gatechs.Section) a time:Interval as virtrdf:Gatech-EventTime ; time:inDateTime th:GatechDatetime(gatechs.Department, gatechs.Code, gatechs.Section) as virtrdf:Gatech-inDateTime . th:GatechDatetime (gatechs.Department, gatechs.Code, gatechs.Section) a time:DateTimeDescription as virtrdf:Gatech-Datetime ; time:dayOfWeek gatechs.Days as virtrdf:Gatech-Days ; time:hour gatechs.Time_ as virtrdf:Gatech-Time_ . th:GatechPlace (gatechs.Department, gatechs.Code, gatechs.Section) a geo:Point as virtrdf:Gatech-Place ; dc:title gatechs.Place as virtrdf:Gatech-RoomBuilding . th:Toronto (torontos.No_) a th:Course as virtrdf:Toronto-Course ; dc:title torontos.title as virtrdf:Toronto-Title ; dc:description torontos.text_ as virtrdf:Toronto-Description ; th:hasInstructor th:TorontoInstructor(torontos.No_) as virtrdf:Toronto-hasInstructor ; th:hasLecture th:TorontoLecture(torontos.No_) as virtrdf:Toronto-hasLecture ; rdfs:seeAlso torontos.coursewebsite as virtrdf:Toronto-CourseWebSite ; th:hasPrerequisite torontos.prereq as virtrdf:Toronto-prereq ; th:text torontos.text_ as virtrdf:Toronto-text; th:forUniversity "http://purl.org/thalia/university/toronto" as virtrdf:Toronto-University ; skos:subject "http://purl.org/subject/thalia/ComputerScience" as virtrdf:Toronto-Subject . th:TorontoInstructor (torontos.No_) a th:Instructor as virtrdf:Toronto-Instructor ; foaf:name torontos.instructorName as virtrdf:Toronto-InstructorName ; foaf:mbox torontos.instructorEmail as virtrdf:Toronto-InstructorEmail . th:TorontoLecture (torontos.No_) a event:Event as virtrdf:Toronto-Lecture ; event:place th:TorontoPlace(torontos.No_) as virtrdf:Toronto-hasPlace . th:TorontoPlace (torontos.No_) a geo:Point as virtrdf:Toronto-Place ; dc:title torontos.location as virtrdf:Toronto-Location . th:Ucsd (ucsds.Number) a th:Course as virtrdf:Ucsd-Course ; dc:title ucsds.Title as virtrdf:Ucsd-Title ; th:hasInstructor1 th:UcsdInstructor1 (ucsds.Number) as virtrdf:Ucsd-hasInstructor1 ; th:hasInstructor2 th:UcsdInstructor2 (ucsds.Number) as virtrdf:Ucsd-hasInstructor2 ; th:hasInstructor3 th:UcsdInstructor3 (ucsds.Number) as virtrdf:Ucsd-hasInstructor3 ; th:forUniversity "http://purl.org/thalia/university/ucsd" as virtrdf:Ucsd-University ; skos:subject "http://purl.org/subject/thalia/ComputerScience" as virtrdf:Ucsd-Subject . th:UcsdInstructor1 (ucsds.Number) a th:Instructor as virtrdf:Ucsd-Instructor1 ; foaf:name ucsds.Fall2003 as virtrdf:Ucsd-Instructor-Fall2003 . th:UcsdInstructor2 (ucsds.Number) a th:Instructor as virtrdf:Ucsd-Instructor2 ; foaf:name ucsds.Winter2004 as virtrdf:Ucsd-Instructor-Winter2004 . th:UcsdInstructor3 (ucsds.Number) a th:Instructor as virtrdf:Ucsd-Instructor3 ; foaf:name ucsds.Spring2004 as virtrdf:Ucsd-Instructor-Spring2004 . th:Umd (umds.Code) a th:Course as virtrdf:Umd-Course ; dc:title umds.CourseName as virtrdf:Umd-Title ; th:hasSection th:SectionTitle as virtrdf:Umd-hasSection ; th:hasLecture th:UmdLecture(umds.Code) as virtrdf:Umd-hasLecture ; th:forUniversity "http://purl.org/thalia/university/umd" as virtrdf:Umd-University ; skos:subject "http://purl.org/subject/thalia/ComputerScience" as virtrdf:Umd-Subject . th:UmdLecture (umds.Code) a event:Event as virtrdf:Umd-Lecture ; event:time th:UmdEventTime(umds.Code) as virtrdf:Umd-hasEventTime . th:UmdEventTime (umds.Code) a time:Interval as virtrdf:Umd-EventTime ; time:inDateTime th:UmdDatetime(umds.Code) as virtrdf:Umd-inDateTime . th:UmdDatetime (umds.Code) a time:DateTimeDescription as virtrdf:Umd-Datetime ; time:hour umds.SectionTime as virtrdf:Umd-SectionTime . } } ') ; delete from db.dba.url_rewrite_rule_list where urrl_list like 'tut_th_%'; delete from db.dba.url_rewrite_rule where urr_rule like 'tut_th_%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tut_th_rule1', 1, '([^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s%%01this', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tut_th_rule2', 1, '([^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%23this%%3E+%%3Fp+%%3Fo+}+FROM+%%3Chttp%%3A//^{URIQADefaultHost}^/thalia%%3E+WHERE+{+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%23this%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tut_th_rule3', 1, '(/[^#]*)/\x24', vector('path'), 1, '%U', vector('path'), null, null, 0, null ); create procedure DB.DBA.REMOVE_THALIA_RDF_DET() { declare colid int; colid := DAV_SEARCH_ID('/DAV/Thalia', 'C'); if (colid < 0) return; update WS.WS.SYS_DAV_COL set COL_DET=null where COL_ID = colid; } ; DB.DBA.REMOVE_THALIA_RDF_DET(); drop procedure DB.DBA.REMOVE_THALIA_RDF_DET; create procedure DB.DBA.THALIA_MAKE_RDF_DET() { declare uriqa_str varchar; uriqa_str := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); uriqa_str := 'http://' || uriqa_str || '/thalia'; DB.DBA."RDFData_MAKE_DET_COL" ('/DAV/Thalia/RDFData/', uriqa_str, NULL); VHOST_REMOVE (lpath=>'/thalia/data/rdf'); DB.DBA.VHOST_DEFINE (lpath=>'/thalia/data/rdf', ppath=>'/DAV/Thalia/RDFData/All/', is_dav=>1, vsp_user=>'dba'); } ; DB.DBA.THALIA_MAKE_RDF_DET(); drop procedure DB.DBA.THALIA_MAKE_RDF_DET; -- procedure to convert path to DET resource name create procedure DB.DBA.THALIA_DET_REF (in par varchar, in fmt varchar, in val varchar) { declare res, iri any; declare uriqa_str varchar; uriqa_str := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); uriqa_str := 'http://' || uriqa_str || '/thalia'; iri := uriqa_str || replace(val, '/', '_'); res := sprintf ('iid (%d).rdf', iri_id_num (iri_to_id (iri))); return sprintf (fmt, res); } ; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('tut_th_rdf', 1, '/thalia/(.*)', vector('path'), 1, '/thalia/data/rdf/%U', vector('path'), 'DB.DBA.THALIA_DET_REF', 'application/rdf.xml', 2, 303); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'tut_th_rule_list1', 1, vector ( 'tut_th_rule1', 'tut_th_rule2', 'tut_th_rule3', 'tut_th_rdf' )); DB.DBA.VHOST_REMOVE (lpath=>'/thalia'); DB.DBA.VHOST_DEFINE (lpath=>'/thalia', ppath=>'/DAV/Thalia/', vsp_user=>'dba', is_dav=>1, is_brws=>0, opts=>vector ('url_rewrite', 'tut_th_rule_list1')); create procedure DB.DBA.LOAD_THALIA_ONTOLOGY_FROM_DAV() { declare content, urihost varchar; select cast (RES_CONTENT as varchar) into content from WS.WS.SYS_DAV_RES where RES_FULL_PATH = '/DAV/Thalia/thalia.owl'; DB.DBA.RDF_LOAD_RDFXML (content, 'http://demo.openlinksw.com/schemas/thalia#', 'http://demo.openlinksw.com/schemas/ThaliaOntology/1.0/'); urihost := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); if (urihost = 'demo.openlinksw.com') { DB.DBA.VHOST_REMOVE (lpath=>'/schemas/thalia'); DB.DBA.VHOST_DEFINE (lpath=>'/schemas/thalia', ppath=>'/DAV/Thalia/thalia.owl', vsp_user=>'dba', is_dav=>1, is_brws=>0); } } ; DB.DBA.LOAD_THALIA_ONTOLOGY_FROM_DAV() ; drop procedure DB.DBA.LOAD_THALIA_ONTOLOGY_FROM_DAV ; DB.DBA.XML_SET_NS_DECL ('thalia', 'http://demo.openlinksw.com/schemas/thalia#', 2) ; * Demo : Thalia test queries #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?room FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; dc:title ?title; th:hasLecture ?lecture. ?lecture event:place [dc:title ?room]. FILTER regex(?title, "Software Engineering") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT ?day, ?hour ?course FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; th:hasLecture [event:time ?time]; dc:title ?title. ?time time:inDateTime [time:dayOfWeek ?day]; time:inDateTime [time:hour ?hour]. FILTER regex(?title, "Computer Networks") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?course FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; dc:title ?Title; th:hasLecture ?lecture. ?lecture event:time [time:inDateTime ?dateTime]. ?dateTime time:hour ?hour. FILTER regex(?Title, "Database System") FILTER regex(?hour, "1:30 - 2:50") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?course ?instructor ?name FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; th:hasInstructor ?instructor. ?instructor foaf:name ?name. } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?instructor FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; th:hasInstructor ?instructor; dc:title ?title. FILTER regex(?title, "Database") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?instructor FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; dc:title ?title; th:hasInstructor ?instructor. FILTER regex(?title, "Software") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT DISTINCT ?course FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; dc:title ?title; th:forUniversity 'http://purl.org/thalia/university/umd'. FILTER regex(?title, "Data Structures") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?course FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; dc:title ?Title; th:hasUnits ?credits. FILTER (xsd:integer(?credits) > 10) FILTER regex(?Title, "Database") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?course FORM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; dc:title ?title; th:forUniversity 'http://purl.org/thalia/university/umd'. FILTER regex(?title, "Database") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?course FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; dc:title ?Title; th:hasUnits ?credits. FILTER (xsd:integer(?credits) > 10) FILTER regex(?Title, "Database") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX th: <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?text_ FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; dc:title ?title; th:text ?text_. FILTER regex(?title, "Verification") } #service:/sparql #should-sponge:soft PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX event: <http://purl.org/NET/c4dm/event.owl#> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX : <http://purl.org/ontology/thalia/1.0/> SELECT distinct ?course FROM <http://demo.openlinksw.com/thalia> WHERE { ?course a th:Course; dc:description ?description; th:forUniversity 'http://purl.org/thalia/university/gatech'. FILTER regex(?description, "JR") }
The following code creates the Musicbrainz RDF Views Deployment and Demo Scripts:
create text index on ZITGIST.MO.artist ("name") with key id; create text index on ZITGIST.MO.artistalias ("name") with key id; create text index on ZITGIST.MO.album ("name") with key id; create text index on ZITGIST.MO.track ("name") with key id; vt_batch_update (fix_identifier_case ('ZITGIST.MO.artist'), 'ON', NULL); vt_batch_update (fix_identifier_case ('ZITGIST.MO.artistalias'), 'ON', NULL); vt_batch_update (fix_identifier_case ('ZITGIST.MO.album'), 'ON', NULL); vt_batch_update (fix_identifier_case ('ZITGIST.MO.track'), 'ON', NULL); VT_INC_INDEX_DB_MO_artist (); VT_INC_INDEX_DB_MO_artistalias (); VT_INC_INDEX_DB_MO_album (); VT_INC_INDEX_DB_MO_track ();
Note: Making sure that the graphs and views are deleting to clean Virtuoso from the old definitions
SPARQL drop quad storage virtrdf:MBZROOT. ; SPARQL prefix mbz: <http://musibrainz.org/schemas/mbz#> drop literal class mbz:duration ; SPARQL prefix mbz: <http://musibrainz.org/schemas/mbz#> drop literal class mbz:created. drop literal class mbz:official_iri. drop literal class mbz:bootleg_iri. drop literal class mbz:promotion_iri. drop literal class mbz:album_iri. drop literal class mbz:single_iri. drop literal class mbz:ep_iri. drop literal class mbz:compilation_iri. drop literal class mbz:soundtrack_iri. drop literal class mbz:spokenword_iri. drop literal class mbz:interview_iri. drop literal class mbz:audiobook_iri. drop literal class mbz:live_iri. drop literal class mbz:remix_iri. ;
The following SPARQL query will fix an issue Virtuoso has with its JSO system. Perform this query for now, the issue should be fixed in a future release
SPARQL define input:storage "" DELETE FROM GRAPH (iri(bif:JSO_SYS_GRAPH NIL)) { ?s virtrdf:version ?o } WHERE { graph `iri(bif:JSO_SYS_GRAPH NIL)` {?s virtrdf:version ?o}}; SPARQL_RELOAD_QM_GRAPH();
Creation of IRIs classes.
SPARQL prefix mbz: <http://musibrainz.org/schemas/mbz#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix dc: <http://purl.org/dc/elements/1.1/> prefix bio: <http://vocab.org/bio/0.1/#> prefix rel: <http://vocab.org/relationship/#> prefix mo: <http://purl.org/ontology/mo/> prefix timeline: <http://purl.org/NET/c4dm/timeline.owl#> prefix event: <http://purl.org/NET/c4dm/event.owl#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix sim: <http://purl.org/ontology/sim/> create iri class mbz:artist_iri "http://zitgist.com/music/artist/%U" (in gid varchar not null) option (bijection) . create iri class mbz:artist_birth_event_iri "http://zitgist.com/music/artist/birth/%U" (in gid varchar not null) option (bijection) . create iri class mbz:artist_death_event_iri "http://zitgist.com/music/artist/death/%U" (in gid varchar not null) option (bijection) . create iri class mbz:sim_link_iri "http://zitgist.com/music/artist/simlink/%U" (in gid varchar not null) option (bijection) . #create iri class mbz:band_iri "http://zitgist.com/music/band/%U" (in gid varchar not null) option (bijection) . #create iri class mbz:band_birth_event_iri "http://zitgist.com/music/band/birth/%U" (in gid varchar not null) option (bijection) . #create iri class mbz:band_death_event_iri "http://zitgist.com/music/band/death/%U" (in gid varchar not null) option (bijection) . create iri class mbz:record_iri "http://zitgist.com/music/record/%U" (in gid varchar not null) option (bijection) . create iri class mbz:performance_iri "http://zitgist.com/music/performance/%U" (in gid varchar not null) option (bijection) . create iri class mbz:composition_iri "http://zitgist.com/music/composition/%U" (in gid varchar not null) option (bijection) . create iri class mbz:musicalwork_iri "http://zitgist.com/music/musicalwork/%U" (in gid varchar not null) option (bijection) . create iri class mbz:sound_iri "http://zitgist.com/music/sound/%U" (in gid varchar not null) option (bijection) . create iri class mbz:recording_iri "http://zitgist.com/music/recording/%U" (in gid varchar not null) option (bijection) . create iri class mbz:signal_iri "http://zitgist.com/music/signal/%U" (in gid varchar not null) option (bijection) . create iri class mbz:track_iri "http://zitgist.com/music/track/%U" (in gid varchar not null) option (bijection) . create iri class mbz:image_iri "http://ec1.images-amazon.com/images/P/%U.01.MZZZZZZZ.jpg" (in image varchar not null) option (bijection) . create iri class mbz:amazon_asin_iri "http://amazon.com/exec/obidos/ASIN/%U/searchcom07-20" (in gid varchar not null) option (bijection) . create literal class mbz:created using function ZITGIST.MO.RECORD_CREATION_DATE (in datestring varchar) returns varchar, function ZITGIST.MO.RECORD_CREATION_DATE_INVERSE (in datestring varchar) returns varchar . create iri class mbz:official_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_OFFICIAL (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/official') . create iri class mbz:promotion_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_PROMOTION (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/promotion') . create iri class mbz:bootleg_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_BOOTLEG (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/bootleg') . create iri class mbz:album_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_ALBUM (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/album') . create iri class mbz:single_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_SINGLE (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/single') . create iri class mbz:ep_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_EP (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/ep') . create iri class mbz:compilation_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_COMPILATION (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/compilation') . create iri class mbz:soundtrack_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_SOUNDTRACK (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/soundtrack') . create iri class mbz:spokenword_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_SPOKENWORD (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/spokenword') . create iri class mbz:interview_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_INTERVIEW (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/interview') . create iri class mbz:audiobook_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_AUDIOBOOK (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/audiobook') . create iri class mbz:live_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_LIVE (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/live') . create iri class mbz:remix_iri using function ZITGIST.MO.RECORD_ATTRIBUTE_REMIX (in attributes varchar) returns varchar option (returns 'http://purl.org/ontology/mo/remix') . create iri class mbz:duration_iri "http://zitgist.com/music/track/duration/%U" (in gid varchar not null) . create literal class mbz:duration using function ZITGIST.MO.TRACK_DURATION (in duration integer) returns varchar , function ZITGIST.MO.TRACK_DURATION_INVERSE (in durationXSD varchar) returns integer . create iri class mbz:geoname_country_iri "http://www.geonames.org/countries/#%U" (in country varchar not null) . create iri class mbz:url_iri "%s" (in url varchar not null) . create iri class mbz:mbz_release_url_iri "http://musicbrainz.org/release/%s.html" (in mbz_gid varchar not null) . create iri class mbz:mbz_track_url_iri "http://musicbrainz.org/track/%s.html" (in mbz_gid varchar not null) . create iri class mbz:mbz_artist_url_iri "http://musicbrainz.org/artist/%s.html" (in mbz_gid varchar not null) . ;
List of functions used to compute some IRI classes:
Note:These functions have been developed to handle some weird user cases of the Musicbrainz data model (like the Attribute column of the album table, etc).
create function ZITGIST.MO.TRACK_DURATION_INVERSE(in durationXSD varchar) { return null; }; create function ZITGIST.MO.TRACK_DURATION(in duration integer) { declare minutes, seconds, milliseconds integer; minutes := ((duration / 1000) / 60); if(minutes >= 1) { minutes := cast(minutes as integer); } else { minutes := 0; } seconds := (duration / 1000) - (minutes * 60); if(seconds >= 1) { seconds := cast(seconds as integer); } milliseconds := duration - (seconds * 1000) - (minutes * 60000); return sprintf('PT%dM%dS', minutes, seconds); } ; create function ZITGIST.MO.RECORD_CREATION_DATE(in datestring varchar) { return sprintf('%sT00:00:00Z', datestring); }; create function ZITGIST.MO.RECORD_CREATION_DATE_INVERSE(in datestring varchar) { declare pos integer; pos := locate('T00:00:00Z', datestring) - 1; return substring(datestring, 1, pos); }; create function ZITGIST.MO.RECORD_ATTRIBUTE(in attribute integer, in attributes varchar) { declare attributes_array any; attributes_array := split_and_decode(ltrim(rtrim(attributes, '}'), '{'), 0, '\0\0,'); foreach(int attr in attributes_array) do { attr := cast(attr as integer); if(attr = attribute) { if(attr = 100) return 'http://purl.org/ontology/mo/official'; if(attr = 101) return 'http://purl.org/ontology/mo/promotion'; if(attr = 102) return 'http://purl.org/ontology/mo/bootleg'; if(attr = 1) return 'http://purl.org/ontology/mo/album'; if(attr = 2) return 'http://purl.org/ontology/mo/single'; if(attr = 3) return 'http://purl.org/ontology/mo/ep'; if(attr = 4) return 'http://purl.org/ontology/mo/compilation'; if(attr = 5) return 'http://purl.org/ontology/mo/soundtrack'; if(attr = 6) return 'http://purl.org/ontology/mo/spokenword'; if(attr = 7) return 'http://purl.org/ontology/mo/interview'; if(attr = 8) return 'http://purl.org/ontology/mo/audiobook'; if(attr = 9) return 'http://purl.org/ontology/mo/live'; if(attr = 10) return 'http://purl.org/ontology/mo/remix'; } } return null; } ; create function ZITGIST.MO.RECORD_ATTRIBUTE_OFFICIAL(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(100, attributes); } ; create function ZITGIST.MO.RECORD_ATTRIBUTE_PROMOTION(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(101, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_BOOTLEG(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(102, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_ALBUM(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(1, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_SINGLE(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(2, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_EP(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(3, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_COMPILATION(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(4, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_SOUNDTRACK(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(5, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_SPOKENWORD(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(6, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_INTERVIEW(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(7, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_AUDIOBOOK(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(8, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_LIVE(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(9, attributes);} ; create function ZITGIST.MO.RECORD_ATTRIBUTE_REMIX(in attributes varchar) { return ZITGIST.MO.RECORD_ATTRIBUTE(10, attributes);} ;
Definition of the quad map patterns
This what creates the RDF triples from the musicbrainz relational database schema.
SPARQL prefix mbz: <http://musibrainz.org/schemas/mbz#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix dc: <http://purl.org/dc/elements/1.1/> prefix dcterms: <http://purl.org/dc/terms/> prefix bio: <http://vocab.org/bio/0.1/#> prefix rel: <http://vocab.org/relationship/#> prefix mo: <http://purl.org/ontology/mo/> prefix timeline: <http://purl.org/NET/c4dm/timeline.owl#> prefix event: <http://purl.org/NET/c4dm/event.owl#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix sim: <http://purl.org/ontology/sim/> create quad storage virtrdf:MBZROOT # # Definition of the source tables from the mbz relational database and their joints. ######### FROM ZITGIST.MO.track as track text literal name FROM ZITGIST.MO.artist as track_artist FROM ZITGIST.MO.puid as track_puid FROM ZITGIST.MO.track as track_track FROM ZITGIST.MO.url as track_url FROM ZITGIST.MO.artist as track_artist_creator where (^{track.}^.artist = ^{track_artist_creator.}^.id) FROM ZITGIST.MO.albumjoin as track_albumjoin where (^{track.}^.id = ^{track_albumjoin.}^.track) FROM ZITGIST.MO.l_artist_track as l_artist_track2 where (^{track.}^.id = ^{l_artist_track2.}^.link1) where (^{track_artist.}^.id = ^{l_artist_track2.}^.link0) FROM ZITGIST.MO.puidjoin as puidjoin where (^{track.}^.id = ^{puidjoin.}^.track) where (^{puidjoin.}^.puid = ^{track_puid.}^.id) FROM ZITGIST.MO.l_track_track as l_track_track where (^{track.}^.id = ^{l_track_track.}^.link0) where (^{track_track.}^.id = ^{l_track_track.}^.link1) FROM ZITGIST.MO.l_track_url as l_track_url where (^{track.}^.id = ^{l_track_url.}^.link0) where (^{track_url.}^.id = ^{l_track_url.}^.link1) FROM ZITGIST.MO.album as album text literal name FROM ZITGIST.MO.artist as album_artist FROM ZITGIST.MO.album as album_album FROM ZITGIST.MO.url as album_url FROM ZITGIST.MO.country as album_release_country FROM ZITGIST.MO.track as album_albumjoin_track FROM ZITGIST.MO.artist as album_artist_creator where (^{album.}^.artist = ^{album_artist_creator.}^.id) FROM ZITGIST.MO.album_amazon_asin as album_amazon_asin where (^{album.}^.id = ^{album_amazon_asin.}^.album) FROM ZITGIST.MO.albumjoin as album_albumjoin where (^{album.}^.id = ^{album_albumjoin.}^.album) where (^{album_albumjoin.}^.track = ^{album_albumjoin_track.}^.id) FROM ZITGIST.MO.l_album_artist as l_album_artist2 where (^{album.}^.id = ^{l_album_artist2.}^.link0) where (^{album_artist.}^.id = ^{l_album_artist2.}^.link1) FROM ZITGIST.MO.l_album_album as l_album_album where (^{album.}^.id = ^{l_album_album.}^.link0) where (^{album_album.}^.id = ^{l_album_album.}^.link1) FROM ZITGIST.MO.l_album_url as l_album_url where (^{album.}^.id = ^{l_album_url.}^.link0) where (^{album_url.}^.id = ^{l_album_url.}^.link1) FROM ZITGIST.MO.release as album_release where (^{album.}^.id = ^{album_release.}^.album) where (^{album_release.}^.country = ^{album_release_country.}^.id) FROM ZITGIST.MO.artist as sim_band FROM ZITGIST.MO.artist as sim_artist FROM ZITGIST.MO.url as band_url FROM ZITGIST.MO.artist as band_member FROM ZITGIST.MO.album as band_album FROM ZITGIST.MO.track as band_track FROM ZITGIST.MO.artist as band text literal name where (^{band.}^.type = 2) #FROM ZITGIST.MO.artist as artist text literal name where (^{artist.}^.type <> 2) FROM ZITGIST.MO.artist as artist text literal name where (__or (neq(^{artist.}^.type, 2), isnull (^{artist.}^.type))) FROM ZITGIST.MO.artist as artist_untyped text literal name where (^{artist_untyped.}^.type <> 2) where (^{artist.}^.gid = ^{artist_untyped.}^.gid) FROM ZITGIST.MO.album as band_album_creatorOf where (^{band_album_creatorOf.}^.artist = ^{band.}^.id) FROM ZITGIST.MO.track as band_track_creatorOf where (^{band_track_creatorOf.}^.artist = ^{band.}^.id) FROM ZITGIST.MO.artistalias as bandalias text literal name where (^{band.}^.id = ^{bandalias.}^."ref") FROM ZITGIST.MO.l_artist_artist as band_l_artist_artist where (^{band_member.}^.id = ^{band_l_artist_artist.}^.link0) where (^{band.}^.id = ^{band_l_artist_artist.}^.link1) where (^{band_l_artist_artist.}^.link_type = 2) FROM ZITGIST.MO.artist_relation as band_relation where (^{artist.}^.id = ^{band_relation.}^.artist) where (^{band.}^.id = ^{band_relation.}^.artist) where (^{sim_band.}^.id = ^{band_relation.}^."ref") FROM ZITGIST.MO.artist_relation as artist_relation where (^{artist.}^.id = ^{artist_relation.}^.artist) where (^{band.}^.id = ^{artist_relation.}^.artist) where (^{sim_artist.}^.id = ^{artist_relation.}^."ref") FROM ZITGIST.MO.l_artist_url as l_artist_url3 where (^{band.}^.id = ^{l_artist_url3.}^.link0) where (^{band_url.}^.id = ^{l_artist_url3.}^.link1) FROM ZITGIST.MO.l_album_artist as l_album_artist3 where (^{band.}^.id = ^{l_album_artist3.}^.link1) where (^{band_album.}^.id = ^{l_album_artist3.}^.link0) FROM ZITGIST.MO.l_artist_track as l_artist_track3 where (^{band.}^.id = ^{l_artist_track3.}^.link0) where (^{band_track.}^.id = ^{l_artist_track3.}^.link1) FROM ZITGIST.MO.url as artist_url FROM ZITGIST.MO.artist as artist_artist FROM ZITGIST.MO.track as artist_track FROM ZITGIST.MO.album as artist_album FROM ZITGIST.MO.album as artist_album_creatorOf where (^{artist_album_creatorOf.}^.artist = ^{artist.}^.id) FROM ZITGIST.MO.track as artist_track_creatorOf where (^{artist_track_creatorOf.}^.artist = ^{artist.}^.id) FROM ZITGIST.MO.artistalias as artistalias text literal name where (^{artist.}^.id = ^{artistalias.}^."ref") FROM ZITGIST.MO.l_artist_url as l_artist_url where (^{artist.}^.id = ^{l_artist_url.}^.link0) where (^{artist_url.}^.id = ^{l_artist_url.}^.link1) FROM ZITGIST.MO.l_artist_artist as l_artist_artist where (^{artist.}^.id = ^{l_artist_artist.}^.link0) where (^{artist_artist.}^.id = ^{l_artist_artist.}^.link1) FROM ZITGIST.MO.l_artist_track as l_artist_track where (^{artist.}^.id = ^{l_artist_track.}^.link0) where (^{artist_track.}^.id = ^{l_artist_track.}^.link1) FROM ZITGIST.MO.l_album_artist as l_album_artist where (^{artist.}^.id = ^{l_album_artist.}^.link1) where (^{artist_album.}^.id = ^{l_album_artist.}^.link0) { create virtrdf:MBZ as graph iri ("http://musicbrainz.org/") option (exclusive) { # Track Composition Event mbz:composition_iri (track.gid) a mo:Composition as mbz:track_is_composition; dc:title track.name as mbz:title_of_track; mo:composer mbz:artist_iri (track_artist_creator.gid) as mbz:creator_composer_of_track; mo:composer mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 14) option (using l_artist_track2) as mbz:composer14_of_track; mo:producesWork mbz:musicalwork_iri (track.gid) as mbz:track_producesWork. # Track Musical Work mbz:musicalwork_iri (track.gid) a mo:MusicalWork as mbz:track_is_mw; dc:title track.name as mbz:name_of_mw; mo:productOfComposition mbz:composition_iri(track.gid) as mbz:mw_is_productOfComposition_of; mo:usedInPerformance mbz:performance_iri(track.gid) as mbz:mw_usedInPerformance. # Track Performance Event mbz:performance_iri (track.gid) a mo:Performance; dc:title track.name; mo:performer mbz:artist_iri (track_artist_creator.gid); mo:performer mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 2) option (using l_artist_track2); mo:conductor mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 9) option (using l_artist_track2); mo:usesWork mbz:musicalwork_iri (track.gid); mo:producesSound mbz:sound_iri (track.gid); mo:recordedAs mbz:signal_iri(track.gid). # Track Sound mbz:sound_iri (track.gid) a mo:Sound; dc:title track.name; mo:productOfPerformance mbz:performance_iri (track.gid); mo:usedInRecording mbz:recording_iri (track.gid). # Track Recording Event mbz:recording_iri (track.gid) a mo:Recording; dc:title track.name; mo:recordsSound mbz:sound_iri (track.gid); mo:producesSignal mbz:signal_iri (track.gid). # Track Signal (Musical Expression) mbz:signal_iri (track.gid) a mo:Signal; dc:title track.name; mo:remixer mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 11) option (using l_artist_track2); mo:sampler mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 12) option (using l_artist_track2); mo:djmixed mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 40) option (using l_artist_track2); mo:djmix_of mbz:track_iri (track_track.gid) where (^{l_track_track.}^.link_type = 13) option (using l_track_track); mo:remix_of mbz:track_iri (track_track.gid) where (^{l_track_track.}^.link_type = 6) option (using l_track_track); mo:remix_of mbz:track_iri (track_track.gid) where (^{l_track_track.}^.link_type = 11) option (using l_track_track); mo:mashup_of mbz:track_iri (track_track.gid) where (^{l_track_track.}^.link_type = 8) option (using l_track_track); mo:mashup_of mbz:track_iri (track_track.gid) where (^{l_track_track.}^.link_type = 4) option (using l_track_track); mo:remaster_of mbz:track_iri (track_track.gid) where (^{l_track_track.}^.link_type = 3) option (using l_track_track); mo:compilation_of mbz:track_iri (track_track.gid) where (^{l_track_track.}^.link_type = 10) option (using l_track_track); mo:compilation_of mbz:track_iri (track_track.gid) where (^{l_track_track.}^.link_type = 12) option (using l_track_track); mo:medley_of mbz:record_iri (track_track.gid) where (^{l_track_track.}^.link_type = 14) option (using l_track_track); mo:published_as mbz:track_iri (track.gid); mo:signalTime mbz:duration_iri(track.gid); mo:puid track_puid.puid option (using puidjoin). # Track duration mbz:duration_iri(track.gid) a timeline:Interval; timeline:durationXSD mbz:duration(track.length). mbz:track_iri(track.gid) a mo:Track; dc:title track.name; mo:trackNum track_albumjoin.sequence; dc:creator mbz:artist_iri (track_artist_creator.gid); dc:creator mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 14) option (using l_artist_track2); mo:compiler mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 39) option (using l_artist_track2); mo:producer mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 18) option (using l_artist_track2); mo:publisher mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 35) option (using l_artist_track2); mo:engineer mbz:artist_iri (track_artist.gid) where (^{l_artist_track2.}^.link_type = 19) option (using l_artist_track2); mo:licence mbz:url_iri(track_url.url) where (^{l_track_url.}^.link_type = 21) option (using l_track_url); mo:paiddownload mbz:url_iri(track_url.url) where (^{l_track_url.}^.link_type = 16) option (using l_track_url); mo:freedownload mbz:url_iri(track_url.url) where (^{l_track_url.}^.link_type = 17) option (using l_track_url); mo:olga mbz:url_iri(track_url.url) where (^{l_track_url.}^.link_type = 19) option (using l_track_url); mo:musicbrainz mbz:mbz_track_url_iri(track.gid); mo:duration track.length. # Record Composition Event mbz:composition_iri (album.gid) a mo:Composition; dc:title album.name; mo:composer mbz:artist_iri (album_artist_creator.gid); mo:composer mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 14) option (using l_album_artist2); mo:producesWork mbz:musicalwork_iri (album.gid). # Record Musical Work mbz:musicalwork_iri (album.gid) a mo:MusicalWork; dc:title album.name; mo:productOfComposition mbz:composition_iri(album.gid); mo:usedInPerformance mbz:performance_iri(album.gid). # Record Performance Event mbz:performance_iri (album.gid) a mo:Performance; dc:title album.name; mo:performer mbz:artist_iri (album_artist_creator.gid); mo:performer mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 2) option (using l_album_artist2); mo:conductor mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 9) option (using l_album_artist2); mo:usesWork mbz:musicalwork_iri (album.gid); mo:producesSound mbz:sound_iri (album.gid); mo:recordedAs mbz:record_iri(album.gid). # Record Sound mbz:sound_iri (album.gid) a mo:Sound; dc:title album.name; mo:productOfPerformance mbz:performance_iri (album.gid); mo:usedInRecording mbz:recording_iri (album.gid). # Record Recording Event mbz:recording_iri (album.gid) a mo:Recording; dc:title album.name; mo:recordsSound mbz:sound_iri (album.gid); mo:producesSignal mbz:signal_iri (album.gid). # Record Signal (Musical Expression) mbz:signal_iri (album.gid) a mo:Signal; dc:title album.name; mo:djmix_of mbz:record_iri (album_album.gid) where (^{l_album_album.}^.link_type = 9) option (using l_album_album); mo:remix_of mbz:record_iri (album_album.gid) where (^{l_album_album.}^.link_type = 7) option (using l_album_album); mo:remix_of mbz:record_iri (album_album.gid) where (^{l_album_album.}^.link_type = 4) option (using l_album_album); mo:mashup_of mbz:record_iri (album_album.gid) where (^{l_album_album.}^.link_type = 5) option (using l_album_album); mo:remaster_of mbz:record_iri (album_album.gid) where (^{l_album_album.}^.link_type = 3) option (using l_album_album); mo:tribute_to mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 44) option (using l_album_artist2); mo:remixer mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 11) option (using l_album_artist2); mo:djmixed mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 38) option (using l_album_artist2); mo:sampler mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 12) option (using l_album_artist2); mo:published_as mbz:record_iri (album.gid). # Record (Musical Manifestation) mbz:record_iri (album.gid) a mo:Record; dc:title album.name; dc:date mbz:created(album_release.releasedate); mo:image mbz:image_iri(album_amazon_asin.asin); #Empty for now. mo:compilation_of mbz:record_iri (album_album.gid) where (^{l_album_album.}^.link_type = 8) option (using l_album_album); mo:releaseStatus mbz:official_iri(album.attributes); mo:releaseStatus mbz:promotion_iri(album.attributes); mo:releaseStatus mbz:bootleg_iri(album.attributes); mo:releaseType mbz:album_iri(album.attributes); mo:releaseType mbz:single_iri(album.attributes); mo:releaseType mbz:ep_iri(album.attributes); mo:releaseType mbz:compilation_iri(album.attributes); mo:releaseType mbz:soundtrack_iri(album.attributes); mo:releaseType mbz:spokenword_iri(album.attributes); mo:releaseType mbz:interview_iri(album.attributes); mo:releaseType mbz:audiobook_iri(album.attributes); mo:releaseType mbz:live_iri(album.attributes); mo:releaseType mbz:remix_iri(album.attributes); dc:creator mbz:artist_iri (album_artist_creator.gid); dc:creator mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 14) option (using l_album_artist2); mo:compiler mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 41) option (using l_album_artist2); mo:producer mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 18) option (using l_album_artist2); mo:publisher mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 35) option (using l_album_artist2); mo:engineer mbz:artist_iri (album_artist.gid) where (^{l_album_artist2.}^.link_type = 19) option (using l_album_artist2); mo:musicbrainz mbz:mbz_release_url_iri(album.gid); mo:musicmoz mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 25) option (using l_album_url); mo:discogs mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 24) option (using l_album_url); mo:wikipedia mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 23) option (using l_album_url); mo:discography mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 1) option (using l_album_url); mo:freedownload mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 21) option (using l_album_url); mo:discography mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 16) option (using l_album_url); mo:mailorder mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 19) option (using l_album_url); mo:imdb mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 27) option (using l_album_url); mo:paiddownload mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 20) option (using l_album_url); mo:licence mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 32) option (using l_album_url); mo:review mbz:url_iri(album_url.url) where (^{l_album_url.}^.link_type = 17) option (using l_album_url); mo:amazon_asin mbz:amazon_asin_iri(album_amazon_asin.asin); mo:has_track mbz:track_iri (album_albumjoin_track.gid) option (using album_albumjoin). # Music Group (Band) # mbz:band_iri(band.gid) mbz:artist_iri(band.gid) a mo:MusicArtist; a mo:MusicGroup; a foaf:Group; foaf:name band.name; foaf:nick bandalias.name; # bio:event mbz:band_birth_event_iri(band.gid); # bio:event mbz:band_death_event_iri(band.gid); bio:event mbz:artist_birth_event_iri(band.gid); bio:event mbz:artist_death_event_iri(band.gid); # mo:similar_to mbz:band_iri(sim_band.gid) option (using band_relation); mo:similar_to mbz:artist_iri(sim_band.gid) option (using band_relation); mo:similar_to mbz:artist_iri(sim_artist.gid) option (using artist_relation); # sim:link mbz:sim_link_iri(sim_band.gid) option (using band_relation); # sim:link mbz:sim_link_iri(sim_artist.gid) option (using artist_relation); foaf:member mbz:artist_iri(band_member.gid) option (using band_l_artist_artist); # l_artist_url mo:myspace mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 19) option (using l_artist_url3); mo:musicmoz mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 12) option (using l_artist_url3); mo:discogs mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 11) option (using l_artist_url3); mo:wikipedia mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 10) option (using l_artist_url3); mo:discography mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 1) option (using l_artist_url3); mo:freedownload mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 8) option (using l_artist_url3); mo:fanpage mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 3) option (using l_artist_url3); mo:biography mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 4) option (using l_artist_url3); mo:discography mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 5) option (using l_artist_url3); mo:mailorder mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 15) option (using l_artist_url3); mo:imdb mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 17) option (using l_artist_url3); mo:paiddownload mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 7) option (using l_artist_url3); foaf:depiction mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 14) option (using l_artist_url3); foaf:homepage mbz:url_iri(band_url.url) where (^{l_artist_url3.}^.link_type = 2) option (using l_artist_url3); mo:musicbrainz mbz:mbz_artist_url_iri(band.gid); # l_album_artist mo:composed mbz:composition_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 14) option (using l_album_artist3); mo:performed mbz:performance_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 14) option (using l_album_artist3); mo:performed mbz:performance_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 2) option (using l_album_artist3); mo:conducted mbz:performance_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 9) option (using l_album_artist3); mo:compiled mbz:record_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 41) option (using l_album_artist3); mo:djmixed mbz:record_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 38) option (using l_album_artist3); mo:remixed mbz:record_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 11) option (using l_album_artist3); mo:sampled mbz:record_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 12) option (using l_album_artist3); mo:produced mbz:record_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 18) option (using l_album_artist3); mo:published mbz:record_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 35) option (using l_album_artist3); mo:engineered mbz:record_iri (band_album.gid) where (^{l_album_artist3.}^.link_type = 19) option (using l_album_artist3); # # mo:creatorOfRecord mbz:record_iri(band_album_creatorOf.gid); foaf:made mbz:record_iri(band_album_creatorOf.gid); # l_artist_track mo:composed mbz:composition_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 14) option (using l_artist_track3); mo:performed mbz:performance_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 14) option (using l_artist_track3); mo:performed mbz:performance_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 2) option (using l_artist_track3); mo:conducted mbz:performance_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 9) option (using l_artist_track3); mo:compiled mbz:record_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 39) option (using l_artist_track3); mo:djmixed mbz:track_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 40) option (using l_artist_track3); mo:remixed mbz:track_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 11) option (using l_artist_track3); mo:sampled mbz:track_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 12) option (using l_artist_track3); mo:produced mbz:track_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 18) option (using l_artist_track3); mo:published mbz:track_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 35) option (using l_artist_track3); mo:engineered mbz:track_iri (band_track.gid) where (^{l_artist_track3.}^.link_type = 19) option (using l_artist_track3). # # mo:creatorOfTrack mbz:track_iri(band_track_creatorOf.gid). # Music Group (Band)'s Birth Event # mbz:band_birth_event_iri(band.gid) mbz:artist_birth_event_iri(band.gid) a bio:Birth; bio:date band.begindate. # Music Group (Band)'s Death Event # mbz:band_death_event_iri(band.gid) mbz:artist_death_event_iri(band.gid) a bio:Death; bio:date band.enddate. # Similarity link #mbz:sim_link_iri(sim_band.gid) # sim:relation mo:similar_to; # sim:level band_relation.weight; # sim:to sim_band.gid. # Music Artist mbz:artist_iri (artist.gid) # artist a mo:MusicArtist; a mo:SoloMusicArtist where (^{artist_untyped.}^.gid is not null) option (using artist_untyped); a foaf:Person where (^{artist_untyped.}^.gid is not null) option (using artist_untyped); foaf:name artist.name; foaf:nick artistalias.name; bio:event mbz:artist_birth_event_iri(artist.gid); bio:event mbz:artist_death_event_iri(artist.gid); mo:member_of mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 2) option (using l_artist_artist); # l_artist_artist rel:siblingOf mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 7) option (using l_artist_artist); rel:friendOf mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 5) option (using l_artist_artist); rel:parentOf mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 6) option (using l_artist_artist); rel:collaborated_with mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 11) option (using l_artist_artist); rel:engagedTo mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 9) option (using l_artist_artist); rel:spouseOf mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 8) option (using l_artist_artist); mo:supporting_musician mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 13) option (using l_artist_artist); mo:supporting_musician mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 14) option (using l_artist_artist); mo:supporting_musician mbz:artist_iri(artist_artist.gid) where (^{l_artist_artist.}^.link_type = 15) option (using l_artist_artist); mo:similar_to mbz:artist_iri(sim_artist.gid) option (using artist_relation); # mo:similar_to mbz:band_iri(sim_band.gid) option (using band_relation); mo:similar_to mbz:artist_iri(sim_band.gid) option (using band_relation); # sim:link mbz:sim_link_iri(sim_band.gid) option (using band_relation); # sim:link mbz:sim_link_iri(sim_artist.gid) option (using artist_relation); # l_artist_url mo:myspace mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 19) option (using l_artist_url); mo:musicmoz mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 12) option (using l_artist_url); mo:discogs mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 11) option (using l_artist_url); mo:wikipedia mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 10) option (using l_artist_url); mo:discography mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 1) option (using l_artist_url); mo:freedownload mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 8) option (using l_artist_url); mo:fanpage mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 3) option (using l_artist_url); mo:biography mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 4) option (using l_artist_url); mo:discography mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 5) option (using l_artist_url); mo:mailorder mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 15) option (using l_artist_url); mo:imdb mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 17) option (using l_artist_url); mo:paiddownload mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 7) option (using l_artist_url); foaf:depiction mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 14) option (using l_artist_url); foaf:homepage mbz:url_iri(artist_url.url) where (^{l_artist_url.}^.link_type = 2) option (using l_artist_url); mo:musicbrainz mbz:mbz_artist_url_iri(artist.gid); # l_album_artist mo:composed mbz:composition_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 14) option (using l_album_artist); mo:performed mbz:performance_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 14) option (using l_album_artist); mo:performed mbz:performance_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 2) option (using l_album_artist); mo:conducted mbz:performance_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 9) option (using l_album_artist); mo:compiled mbz:record_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 41) option (using l_album_artist); mo:djmixed mbz:record_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 38) option (using l_album_artist); mo:remixed mbz:record_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 11) option (using l_album_artist); mo:sampled mbz:record_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 12) option (using l_album_artist); mo:produced mbz:record_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 18) option (using l_album_artist); mo:published mbz:record_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 35) option (using l_album_artist); mo:engineered mbz:record_iri (artist_album.gid) where (^{l_album_artist.}^.link_type = 19) option (using l_album_artist); # mo:creatorOfRecord mbz:record_iri(artist_album_creatorOf.gid); foaf:made mbz:record_iri(artist_album_creatorOf.gid); # l_artist_track mo:composed mbz:composition_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 14) option (using l_artist_track); mo:performed mbz:performance_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 14) option (using l_artist_track); mo:performed mbz:performance_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 2) option (using l_artist_track); mo:conducted mbz:performance_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 9) option (using l_artist_track); mo:compiled mbz:track_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 39) option (using l_artist_track); mo:djmixed mbz:track_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 40) option (using l_artist_track); mo:remixed mbz:track_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 11) option (using l_artist_track); mo:sampled mbz:track_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 12) option (using l_artist_track); mo:produced mbz:track_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 18) option (using l_artist_track); mo:published mbz:track_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 35) option (using l_artist_track); mo:engineered mbz:track_iri (artist_track.gid) where (^{l_artist_track.}^.link_type = 19) option (using l_artist_track). # mo:creatorOfTrack mbz:track_iri(artist_track_creatorOf.gid). # Music Artist''s Birth Event mbz:artist_birth_event_iri(artist.gid) a bio:Birth; bio:date artist.begindate. # Music Artist''s Death Event mbz:artist_death_event_iri(artist.gid) a bio:Death; bio:date artist.enddate. # Similarity link #mbz:sim_link_iri(sim_artist.gid) # sim:relation mo:similar_to; # sim:level artist_relation.weight; # sim:to sim_artist.gid. } } ; grant execute on ZITGIST.MO.RECORD_CREATION_DATE to "SPARQL"; grant execute on ZITGIST.MO.RECORD_CREATION_DATE_INVERSE to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_OFFICIAL to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_PROMOTION to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_BOOTLEG to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_ALBUM to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_SINGLE to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_EP to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_COMPILATION to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_SOUNDTRACK to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_SPOKENWORD to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_INTERVIEW to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_AUDIOBOOK to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_LIVE to "SPARQL"; grant execute on ZITGIST.MO.RECORD_ATTRIBUTE_REMIX to "SPARQL"; grant execute on ZITGIST.MO.TRACK_DURATION to "SPARQL"; grant execute on ZITGIST.MO.TRACK_DURATION_INVERSE to "SPARQL"; grant execute on ZITGIST.MO.album_amazon_asin to "SPARQL"; grant execute on ZITGIST.MO.album_name_WORDS to "SPARQL"; grant execute on ZITGIST.MO.albumjoin to "SPARQL"; grant execute on ZITGIST.MO.albummeta to "SPARQL"; grant execute on ZITGIST.MO.artist to "SPARQL"; grant execute on ZITGIST.MO.artist_name_WORDS to "SPARQL"; grant execute on ZITGIST.MO.artist_relation to "SPARQL"; grant execute on ZITGIST.MO.artistalias to "SPARQL"; grant execute on ZITGIST.MO.artistalias_name_WORDS to "SPARQL"; grant execute on ZITGIST.MO.country to "SPARQL"; grant execute on ZITGIST.MO.l_album_album to "SPARQL"; grant execute on ZITGIST.MO.l_album_artist to "SPARQL"; grant execute on ZITGIST.MO.l_album_url to "SPARQL"; grant execute on ZITGIST.MO.l_artist_artist to "SPARQL"; grant execute on ZITGIST.MO.l_artist_track to "SPARQL"; grant execute on ZITGIST.MO.l_artist_url to "SPARQL"; grant execute on ZITGIST.MO.l_track_track to "SPARQL"; grant execute on ZITGIST.MO.l_track_url to "SPARQL"; grant execute on ZITGIST.MO."language" to "SPARQL"; grant execute on ZITGIST.MO.puid to "SPARQL"; grant execute on ZITGIST.MO.puidjoin to "SPARQL"; grant execute on ZITGIST.MO.release to "SPARQL"; grant execute on ZITGIST.MO.track to "SPARQL"; grant execute on ZITGIST.MO.track_name_WORDS to "SPARQL"; grant execute on ZITGIST.MO.url to "SPARQL"; DB.DBA.XML_SET_NS_DECL ('mbz', 'http://musibrainz.org/schemas/mbz#', 2);
RDF View for ODS (the consolidated Graph)
SPARQL drop quad map virtrdf:ODS_DS . ; SPARQL prefix ods: <http://www.openlinksw.com/virtuoso/ods/> create iri class ods:graph "http://^{URIQADefaultHost}^/dataspace/%U" (in uname varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U") . create iri class ods:user "http://^{URIQADefaultHost}^/dataspace/%U#user" (in uname varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U#user") . create iri class ods:user_group "http://^{URIQADefaultHost}^/dataspace/%U#group" (in uname varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U#group") . create iri class ods:person "http://^{URIQADefaultHost}^/dataspace/%U#this" (in uname varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U#this") . create iri class ods:mbox "mailto:%s" (in email varchar not null) option (returns "mailto:%s") . create iri class ods:phone "tel:%s" (in tel varchar not null) option (returns "tel:%s") . create iri class ods:geo_point "http://^{URIQADefaultHost}^/dataspace/%U#geo" (in uname varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U#geo") . create iri class ods:forum "http://^{URIQADefaultHost}^/dataspace/%U/%U/%U" ( in uname varchar not null, in forum_type varchar not null, in forum_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/%U/%U") . create iri class ods:proxy "http://^{URIQADefaultHost}^/proxy/%U" (in url varchar not null) option (returns "http://^{URIQADefaultHost}^/proxy/%U") . create iri class ods:site "http://^{URIQADefaultHost}^/dataspace/%U#site" (in uname varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U#site") . create iri class ods:role "http://^{URIQADefaultHost}^/dataspace/%U/%U/%U#%U" (in uname varchar not null, in tp varchar not null, in inst varchar not null, in role_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/%U/%U#%U" ) . # Blog create iri class ods:blog_forum "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U" (in uname varchar not null, in forum_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U") . create iri class ods:blog_post "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U/%U" (in uname varchar not null, in forum_name varchar not null, in postid varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U/%U" ) . create iri class ods:blog_comment "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U/%U/%d" (in uname varchar not null, in forum_name varchar not null, in postid varchar not null, in comment_id int not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U/%U/%d" ) . create iri class ods:tag "http://^{URIQADefaultHost}^/dataspace/%U/concept#%U" (in uname varchar not null, in tag varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/concept#%U") . create iri class ods:blog_post_text "http://^{URIQADefaultHost}^/dataspace/%U/weblog-text/%U/%U" (in uname varchar not null, in forum_name varchar not null, in postid varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/weblog-text/%U/%U" ) . #Feeds create iri class ods:feed "http://^{URIQADefaultHost}^/dataspace/feed/%d" (in feed_id integer not null) option (returns "http://^{URIQADefaultHost}^/dataspace/feed/%d" ) . create iri class ods:feed_item "http://^{URIQADefaultHost}^/dataspace/feed/%d/%d" (in feed_id integer not null, in item_id integer not null) option (returns "http://^{URIQADefaultHost}^/dataspace/feed/%d/%d" ) . create iri class ods:feed_item_text "http://^{URIQADefaultHost}^/dataspace/feed/%d/%d/text" (in feed_id integer not null, in item_id integer not null) option (returns "http://^{URIQADefaultHost}^/dataspace/feed/%d/%d/text" ) . create iri class ods:feed_mgr "http://^{URIQADefaultHost}^/dataspace/%U/feeds/%U" (in uname varchar not null, in inst_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/feeds/%U" ) . create iri class ods:feed_comment "http://^{URIQADefaultHost}^/dataspace/%U/feeds/%U/%d/%d" (in uname varchar not null, in inst_name varchar not null, in item_id integer not null, in comment_id integer not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/feeds/%U/%d/%d" ) . #Bookmark create iri class ods:bmk_post "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U/%d" (in uname varchar not null, in inst_name varchar not null, in bmk_id integer not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U/%d") . create iri class ods:bmk_post_text "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U/%d/text" (in uname varchar not null, in inst_name varchar not null, in bmk_id integer not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U/%d/text" ) . create iri class ods:bmk_forum "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U" ( in uname varchar not null, in forum_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U") . #Photo create iri class ods:photo_forum "http://^{URIQADefaultHost}^/dataspace/%U/photos/%U" (in uname varchar not null, in inst_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/photos/%U") . create iri class ods:photo_post "http://^{URIQADefaultHost}^%s" (in path varchar not null) option (returns "http://^{URIQADefaultHost}^/DAV/%s") . create iri class ods:photo_post_text "http://^{URIQADefaultHost}^%s/text" (in path varchar not null) option (returns "http://^{URIQADefaultHost}^/DAV/%s/text") . create iri class ods:photo_comment "http://^{URIQADefaultHost}^%s:comment_%d" (in path varchar not null, in comment_id int not null) option (returns "http://^{URIQADefaultHost}^/DAV/%s:comment_%d") . # Community create iri class ods:community_forum "http://^{URIQADefaultHost}^/dataspace/%U/community/%U" (in uname varchar not null, in forum_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/community/%U") . # Briefcase create iri class ods:odrive_forum "http://^{URIQADefaultHost}^/dataspace/%U/briefcase/%U" (in uname varchar not null, in inst_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/briefcase/%U" ) . create iri class ods:odrive_post "http://^{URIQADefaultHost}^%s" (in path varchar not null) option (returns "http://^{URIQADefaultHost}^/DAV/%s") . create iri class ods:odrive_post_text "http://^{URIQADefaultHost}^%s/text" (in path varchar not null) option (returns "http://^{URIQADefaultHost}^/DAV/%s/text") . # Wiki create iri class ods:wiki_post "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U/%U" (in uname varchar not null, in inst_name varchar not null, in topic_id varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U/%U") . create iri class ods:wiki_post_text "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U/%U/text" (in uname varchar not null, in inst_name varchar not null, in topic_id varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U/%U/text" ) . create iri class ods:wiki_forum "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U" ( in uname varchar not null, in forum_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U" ) . #Calendar create iri class ods:calendar_event "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U/%d" (in uname varchar not null, in inst_name varchar not null, in calendar_id integer not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U/%d" ) . create iri class ods:calendar_event_text "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U/%d/text" (in uname varchar not null, in inst_name varchar not null, in calendar_id integer not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U/%d/text" ) . create iri class ods:calendar_forum "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U" ( in uname varchar not null, in forum_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U") . # NNTPF create iri class ods:nntp_forum "http://^{URIQADefaultHost}^/dataspace/discussion/%U" ( in forum_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/discussion/%U"). create iri class ods:nntp_post "http://^{URIQADefaultHost}^/dataspace/discussion/%U/%U" ( in group_name varchar not null, in message_id varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/discussion/%U/%U" ) . create iri class ods:nntp_post_text "http://^{URIQADefaultHost}^/dataspace/discussion/%U/%U/text" ( in group_name varchar not null, in message_id varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/discussion/%U/%U/text") . create iri class ods:nntp_role "http://^{URIQADefaultHost}^/dataspace/discussion/%U#reader" (in forum_name varchar not null) option (returns "http://^{URIQADefaultHost}^/dataspace/discussion/%U#reader") . ; SPARQL prefix sioc: <http://rdfs.org/sioc/ns#> prefix sioct: <http://rdfs.org/sioc/types#> prefix atom: <http://atomowl.org/ontologies/atomrdf#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix dc: <http://purl.org/dc/elements/1.1/> prefix dct: <http://purl.org/dc/terms/> prefix skos: <http://www.w3.org/2004/02/skos/core#> prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> prefix bm: <http://www.w3.org/2002/01/bookmark#> prefix exif: <http://www.w3.org/2003/12/exif/ns/> prefix ann: <http://www.w3.org/2000/10/annotation-ns#> prefix wikiont: <http://sw.deri.org/2005/04/wikipedia/wikiont.owl#> prefix calendar: <http://www.w3.org/2002/12/cal#> prefix ods: <http://www.openlinksw.com/virtuoso/ods/> alter quad storage virtrdf:DefaultQuadStorage FROM DB.DBA.SIOC_USERS as users FROM DB.DBA.SIOC_ODS_FORUMS as forums FROM DB.DBA.SIOC_ROLES as roles FROM DB.DBA.SIOC_ROLE_GRANTS as grants FROM DB.DBA.SIOC_KNOWS as knows FROM DB.DBA.ODS_FOAF_PERSON as person where (^{person.}^.U_NAME = ^{users.}^.U_NAME) where (^{forums.}^.U_NAME = ^{users.}^.U_NAME) where (^{knows.}^.TO_NAME = ^{users.}^.U_NAME) where (^{knows.}^.FROM_NAME = ^{users.}^.U_NAME) where (^{grants.}^.U_NAME = ^{users.}^.U_NAME) where (^{roles.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_BLOG_POSTS as blog_posts where (^{blog_posts.}^.B_OWNER = ^{users.}^.U_NAME) FROM DB.DBA.ODS_BLOG_POST_LINKS as blog_links where (^{blog_links.}^.B_OWNER = ^{users.}^.U_NAME) FROM DB.DBA.ODS_BLOG_POST_ATTS as blog_atts where (^{blog_atts.}^.B_OWNER = ^{users.}^.U_NAME) FROM DB.DBA.ODS_BLOG_POST_TAGS as blog_tags where (^{blog_tags.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_BLOG_COMMENTS as blog_comms where (^{blog_comms.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_BMK_POSTS as bmk_posts where (^{bmk_posts.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_BMK_TAGS as bmk_tags where (^{bmk_tags.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_ODRIVE_POSTS as odrv_posts where (^{odrv_posts.}^.U_MEMBER = ^{users.}^.U_NAME) FROM DB.DBA.ODS_ODRIVE_TAGS as odrv_tags where (^{odrv_tags.}^.U_OWNER = ^{users.}^.U_NAME) FROM DB.DBA.ODS_FEED_FEED_DOMAIN as feed_domain where (^{feed_domain.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_FEED_POSTS as feed_posts where (^{feed_posts.}^.EFI_FEED_ID = ^{feed_domain.}^.EF_ID) FROM DB.DBA.ODS_FEED_COMMENTS as feed_comments where (^{feed_comments.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_FEED_TAGS as feed_tags where (^{feed_tags.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_FEED_LINKS as feed_links where (^{feed_links.}^.EFI_FEED_ID = ^{feed_domain.}^.EF_ID) FROM DB.DBA.ODS_FEED_ATTS as feed_atts where (^{feed_atts.}^.EFI_FEED_ID = ^{feed_domain.}^.EF_ID) FROM DB.DBA.ODS_PHOTO_POSTS as photo_posts where (^{photo_posts.}^.U_MEMBER = ^{users.}^.U_NAME) FROM DB.DBA.ODS_PHOTO_COMMENTS as photo_comments where (^{photo_comments.}^.U_MEMBER = ^{users.}^.U_NAME) FROM DB.DBA.ODS_PHOTO_TAGS as photo_tags where (^{photo_tags.}^.U_MEMBER = ^{users.}^.U_NAME) FROM DB.DBA.ODS_WIKI_POSTS as wiki_posts where (^{wiki_posts.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_COMMUNITIES as community where (^{community.}^.C_OWNER = ^{users.}^.U_NAME) FROM DB.DBA.ODS_NNTP_GROUPS as nntp_groups FROM DB.DBA.ODS_NNTP_POSTS as nntp_posts FROM DB.DBA.ODS_NNTP_USERS as nntp_users where (^{nntp_users.}^.U_NAME = ^{users.}^.U_NAME) FROM DB.DBA.ODS_NNTP_LINKS as nntp_links { create virtrdf:ODS_DS as graph ods:graph (users.U_NAME) option (exclusive) { ods:user (users.U_NAME) a sioc:User ; sioc:id users.U_NAME ; sioc:name users.U_FULL_NAME ; sioc:email ods:mbox (users.E_MAIL) ; sioc:email_sha1 users.E_MAIL_SHA1 ; sioc:account_of ods:person (users.U_NAME) . ods:person (person.U_NAME) a foaf:Person ; foaf:nick person.U_NAME ; foaf:name person.U_FULL_NAME ; foaf:mbox ods:mbox (person.E_MAIL) ; foaf:mbox_sha1sum person.E_MAIL_SHA1 ; foaf:holdsAccount ods:user (person.U_NAME) ; foaf:firstName person.FIRST_NAME ; foaf:family_name person.LAST_NAME ; foaf:gender person.GENDER ; foaf:icqChatID person.ICQ ; foaf:msnChatID person.MSN ; foaf:aimChatID person.AIM ; foaf:yahooChatID person.YAHOO ; foaf:birthday person.BIRTHDAY ; foaf:organization person.ORG ; foaf:phone ods:phone (person.PHONE) ; foaf:based_near ods:geo_point (person.U_NAME) . ods:geo_point (person.U_NAME) a geo:Point ; geo:lat person.LAT ; geo:lng person.LNG . ods:person (knows.FROM_NAME) foaf:knows ods:person (knows.TO_NAME) . ods:person (knows.TO_NAME) foaf:knows ods:person (knows.FROM_NAME) . ods:user_group (grants.G_NAME) a sioc:Usergroup ; sioc:id grants.G_NAME ; sioc:has_member ods:user (grants.U_NAME) . ods:user (grants.U_NAME) sioc:member_of ods:user_group (grants.G_NAME) . ods:role (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST, roles.WMT_NAME) sioc:has_scope ods:forum (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST) ; sioc:function_of ods:user (roles.U_NAME) . ods:forum (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST) sioc:scope_of ods:role (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST, roles.WMT_NAME) . ods:user (roles.U_NAME) sioc:has_function ods:role (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST, roles.WMT_NAME) . ods:forum (forums.U_NAME, forums.APP_TYPE, forums.WAM_INST) a sioc:Container ; sioc:id forums.WAM_INST ; sioc:type forums.APP_TYPE ; sioc:description forums.WAI_DESCRIPTION ; sioc:link ods:proxy (forums.LINK) ; sioc:has_space ods:site (forums.U_NAME) . # Weblog ods:blog_post (blog_posts.B_OWNER, blog_posts.B_INST, blog_posts.B_POST_ID) a sioct:BlogPost ; sioc:link ods:proxy (blog_posts.B_LINK) ; sioc:has_creator ods:user (blog_posts.B_CREATOR) ; foaf:maker ods:person (blog_posts.B_CREATOR) ; sioc:has_container ods:blog_forum (blog_posts.B_OWNER, blog_posts.B_INST) ; dc:title blog_posts.B_TITLE ; dct:created blog_posts.B_CREATED ; dct:modified blog_posts.B_MODIFIED ; sioc:content blog_posts.B_CONTENT . ods:blog_forum (blog_posts.B_OWNER, blog_posts.B_INST) sioc:container_of ods:blog_post (blog_posts.B_OWNER, blog_posts.B_INST, blog_posts.B_POST_ID) . ods:user (blog_posts.B_CREATOR) sioc:creator_of ods:blog_post (blog_posts.B_OWNER, blog_posts.B_INST, blog_posts.B_POST_ID) . ods:blog_post (blog_links.B_OWNER, blog_links.B_INST, blog_links.B_POST_ID) sioc:links_to ods:proxy (blog_links.PL_LINK) . # end Weblog # Bookmark ods:bmk_post (bmk_posts.U_NAME, bmk_posts.WAI_NAME, bmk_posts.BD_BOOKMARK_ID) a bm:Bookmark ; dc:title bmk_posts.BD_NAME; dct:created bmk_posts.BD_CREATED ; dct:modified bmk_posts.BD_LAST_UPDATE ; dc:date bmk_posts.BD_LAST_UPDATE ; ann:created bmk_posts.BD_CREATED ; dc:creator bmk_posts.U_NAME ; bm:recalls ods:proxy (bmk_posts.B_URI) ; sioc:link ods:proxy (bmk_posts.B_URI) ; sioc:content bmk_posts.BD_DESCRIPTION ; sioc:has_creator ods:user (bmk_posts.U_NAME) ; foaf:maker ods:person (bmk_posts.U_NAME) ; sioc:has_container ods:bmk_forum (bmk_posts.U_NAME, bmk_posts.WAI_NAME) . ods:bmk_forum (bmk_posts.U_NAME, bmk_posts.WAI_NAME) sioc:container_of ods:bmk_post (bmk_posts.U_NAME, bmk_posts.WAI_NAME, bmk_posts.BD_BOOKMARK_ID) . ods:user (bmk_posts.U_NAME) sioc:creator_of ods:bmk_post (bmk_posts.U_NAME, bmk_posts.WAI_NAME, bmk_posts.BD_BOOKMARK_ID) . ods:bmk_post (bmk_tags.U_NAME, bmk_tags.WAM_INST, bmk_tags.ITEM_ID) sioc:topic ods:tag (bmk_tags.U_NAME, bmk_tags.BD_TAG) . ods:tag (bmk_tags.U_NAME, bmk_tags.BD_TAG) a skos:Concept ; skos:prefLabel bmk_tags.BD_TAG ; skos:isSubjectOf ods:bmk_post (bmk_tags.U_NAME, bmk_tags.WAM_INST, bmk_tags.ITEM_ID) . # end Bookmark # Briefcase ods:odrive_post (odrv_posts.RES_FULL_PATH) a foaf:Document ; dc:title odrv_posts.RES_NAME ; dct:created odrv_posts.RES_CREATED ; dct:modified odrv_posts.RES_MODIFIED ; sioc:content odrv_posts.RES_DESCRIPTION ; sioc:has_creator ods:user (odrv_posts.U_OWNER) ; foaf:maker ods:person (odrv_posts.U_OWNER) ; sioc:has_container ods:odrive_forum (odrv_posts.U_MEMBER, odrv_posts.WAI_NAME) . ods:odrive_forum (odrv_posts.U_MEMBER, odrv_posts.WAI_NAME) sioc:container_of ods:odrive_post (odrv_posts.RES_FULL_PATH) . ods:user (odrv_posts.U_OWNER) sioc:creator_of ods:odrive_post (odrv_posts.RES_FULL_PATH) . ods:odrive_post (odrv_tags.RES_FULL_PATH) sioc:topic ods:tag (odrv_tags.U_OWNER, odrv_tags.TAG) . ods:tag (odrv_tags.U_OWNER, odrv_tags.TAG) a skos:Concept ; skos:prefLabel odrv_tags.TAG ; skos:isSubjectOf ods:odrive_post (odrv_tags.RES_FULL_PATH) . # end Briefcase # Feeds ods:feed (feed_domain.EF_ID) a atom:Feed ; sioc:link ods:proxy (feed_domain.EF_URI) ; atom:link ods:proxy (feed_domain.EF_URI) ; atom:title feed_domain.EF_TITLE ; sioc:has_parent ods:feed_mgr (feed_domain.U_NAME, feed_domain.WAI_NAME) . ods:feed_mgr (feed_domain.U_NAME, feed_domain.WAI_NAME) sioc:parent_of ods:feed (feed_domain.EF_ID) . ods:feed_item (feed_tags.EFI_FEED_ID, feed_tags.EFID_ITEM_ID) sioc:topic ods:tag (feed_tags.U_NAME, feed_tags.EFID_TAG) . ods:tag (feed_tags.U_NAME, feed_tags.EFID_TAG) a skos:Concept ; skos:prefLabel feed_tags.EFID_TAG ; skos:isSubjectOf ods:feed_item (feed_tags.EFI_FEED_ID, feed_tags.EFID_ITEM_ID) . ods:feed_comment (feed_comments.U_NAME, feed_comments.WAI_NAME, feed_comments.EFIC_ITEM_ID, feed_comments.EFIC_ID) a sioct:Comment ; dc:title feed_comments.EFIC_TITLE ; sioc:content feed_comments.EFIC_COMMENT ; dct:modified feed_comments.LAST_UPDATE ; dct:created feed_comments.LAST_UPDATE ; sioc:link ods:proxy (feed_comments.LINK) ; sioc:has_container ods:feed (feed_comments.EFI_FEED_ID) ; sioc:reply_of ods:feed_item (feed_comments.EFI_FEED_ID, feed_comments.EFIC_ITEM_ID) ; foaf:maker ods:proxy (feed_comments.EFIC_U_URL) . ods:proxy (feed_comments.EFIC_U_URL) a foaf:Person ; foaf:name feed_comments.EFIC_U_NAME; foaf:mbox ods:mbox (feed_comments.EFIC_U_MAIL) . ods:feed (feed_comments.EFI_FEED_ID) sioc:container_of ods:feed_comment (feed_comments.U_NAME, feed_comments.WAI_NAME, feed_comments.EFIC_ITEM_ID, feed_comments.EFIC_ID) . ods:feed_item (feed_comments.EFI_FEED_ID, feed_comments.EFIC_ITEM_ID) sioc:has_reply ods:feed_comment (feed_comments.U_NAME, feed_comments.WAI_NAME, feed_comments.EFIC_ITEM_ID, feed_comments.EFIC_ID) . ods:feed_item (feed_links.EFI_FEED_ID, feed_links.EFI_ID) sioc:links_to ods:proxy (feed_links.EFIL_LINK) . ods:feed_item (feed_atts.EFI_FEED_ID, feed_atts.EFI_ID) sioc:attachment ods:proxy (feed_atts.EFIE_URL) . ods:feed_item (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) a atom:Entry ; sioc:has_container ods:feed (feed_posts.EFI_FEED_ID) ; dc:title feed_posts.EFI_TITLE ; dct:created feed_posts.PUBLISH_DATE ; dct:modified feed_posts.PUBLISH_DATE ; sioc:link ods:proxy (feed_posts.EFI_LINK) ; sioc:content feed_posts.EFI_DESCRIPTION ; atom:title feed_posts.EFI_TITLE ; atom:source ods:feed (feed_posts.EFI_FEED_ID) ; atom:published feed_posts.PUBLISH_DATE ; atom:updated feed_posts.PUBLISH_DATE ; atom:content ods:feed_item_text (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) . ods:feed (feed_posts.EFI_FEED_ID) sioc:container_of ods:feed_item (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) . ods:feed_item_text (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) a atom:Content ; atom:type "text/xhtml" ; atom:lang "en-US" ; atom:body feed_posts.EFI_DESCRIPTION . ods:feed (feed_posts.EFI_FEED_ID) atom:contains ods:feed_item (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) . # end Feeds # Photo ods:photo_post (photo_posts.RES_FULL_PATH) a exif:IFD ; dc:title photo_posts.RES_NAME ; dct:created photo_posts.RES_CREATED ; dct:modified photo_posts.RES_MODIFIED ; sioc:content photo_posts.RES_DESCRIPTION ; sioc:has_creator ods:user (photo_posts.U_OWNER) ; foaf:maker ods:person (photo_posts.U_OWNER) ; sioc:link ods:proxy (photo_posts.RES_LINK) ; sioc:has_container ods:photo_forum (photo_posts.U_MEMBER, photo_posts.WAI_NAME) . ods:photo_forum (photo_posts.U_MEMBER, photo_posts.WAI_NAME) sioc:container_of ods:photo_post (photo_posts.RES_FULL_PATH) . ods:user (photo_posts.U_OWNER) sioc:creator_of ods:photo_post (photo_posts.RES_FULL_PATH) . ods:photo_post (photo_tags.RES_FULL_PATH) sioc:topic ods:tag (photo_tags.U_MEMBER, photo_tags.RES_TAG) . ods:tag (photo_tags.U_MEMBER, photo_tags.RES_TAG) a skos:Concept ; skos:prefLabel photo_tags.RES_TAG ; skos:isSubjectOf ods:photo_post (photo_tags.RES_FULL_PATH) . ods:photo_comment (photo_comments.RES_FULL_PATH, photo_comments.COMMENT_ID) a sioct:Comment ; sioc:reply_of ods:photo_post (photo_comments.RES_FULL_PATH) ; sioc:has_container ods:photo_forum (photo_comments.U_MEMBER, photo_comments.WAI_NAME) ; dc:title photo_comments.RES_NAME ; dct:created photo_comments.CREATE_DATE ; dct:modified photo_comments.MODIFY_DATE ; sioc:content photo_comments.TEXT ; foaf:maker ods:person (photo_comments.U_MAKER) . ods:photo_post (photo_comments.RES_FULL_PATH) sioc:has_reply ods:photo_comment (photo_comments.RES_FULL_PATH, photo_comments.COMMENT_ID) . # end Photo # Polls # end Polls # Mail # end Mail # Wiki ods:wiki_post (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME, wiki_posts.LOCALNAME) a wikiont:Article ; dc:title wiki_posts.LOCALNAME ; dct:created wiki_posts.RES_CREATED ; dct:modified wiki_posts.RES_MODIFIED ; sioc:content wiki_posts.RES_CONTENT ; sioc:has_creator ods:user (wiki_posts.U_NAME) ; foaf:maker ods:person (wiki_posts.U_NAME) ; sioc:has_container ods:wiki_forum (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME) . ods:wiki_forum (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME) sioc:container_of ods:wiki_post (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME, wiki_posts.LOCALNAME) . ods:user (wiki_posts.U_NAME) sioc:creator_of ods:wiki_post (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME, wiki_posts.LOCALNAME) . # end Wiki # Community ods:community_forum (community.C_OWNER, community.CM_COMMUNITY_ID) a sioc:Community ; sioc:has_part ods:forum (community.A_OWNER, community.A_TYPE, community.CM_MEMBER_APP) . ods:forum (community.A_OWNER, community.A_TYPE, community.CM_MEMBER_APP) sioc:part_of ods:community_forum (community.C_OWNER, community.CM_COMMUNITY_ID) . # end Community # NNTP ods:nntp_forum (nntp_groups.NG_NAME) a sioct:MessageBoard ; sioc:id nntp_groups.NG_NAME ; sioc:description nntp_groups.NG_DESC . ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.NM_ID) a sioct:BoardPost ; sioc:content nntp_posts.NM_BODY ; dc:title nntp_posts.FTHR_SUBJ ; dct:created nntp_posts.REC_DATE ; dct:modified nntp_posts.REC_DATE ; foaf:maker ods:proxy (nntp_posts.MAKER) ; sioc:reply_of ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.FTHR_REFER) ; sioc:has_container ods:nntp_forum (nntp_posts.NG_NAME) . ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.FTHR_REFER) sioc:has_reply ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.NM_ID) . ods:nntp_forum (nntp_posts.NG_NAME) sioc:container_of ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.NM_ID) . ods:nntp_role (nntp_groups.NG_NAME) sioc:has_scope ods:nntp_forum (nntp_groups.NG_NAME) . ods:nntp_forum (nntp_groups.NG_NAME) sioc:scope_of ods:nntp_role (nntp_groups.NG_NAME) . ods:user (nntp_users.U_NAME) sioc:has_function ods:nntp_role (nntp_users.NG_NAME) . ods:nntp_role (nntp_users.NG_NAME) sioc:function_of ods:user (nntp_users.U_NAME) . ods:nntp_post (nntp_links.NG_NAME, nntp_links.NML_MSG_ID) sioc:links_to ods:proxy (nntp_links.NML_URL) . # end NNTP } . } . ;
URL Rewrite Rules for ODS
create procedure DB.DBA.URL_REW_ODS_ACCEPT () { declare accept, ret any; accept := http_request_header (http_request_header (), 'Accept'); if (not isstring (accept)) return null; ret := null; if (regexp_match ('(application|text)/rdf.(xml|n3|turtle|ttl)', accept) is not null) { if (regexp_match ('application/rdf.xml', accept) is not null) { ret := 'rdf'; } else if (regexp_match ('text/rdf.n3', accept) is not null) { ret := 'n3'; } else if (regexp_match ('application/rdf.turtle', accept) is not null or regexp_match ('application/rdf.ttl', accept) is not null) { ret := 'n3'; } } return ret; }; create procedure DB.DBA.URL_REW_ODS_SPQ (in graph varchar, in iri varchar, in acc varchar) { declare q, ret any; iri := replace (iri, '''', '%27'); iri := replace (iri, '<', '%3C'); iri := replace (iri, '>', '%3E'); q := sprintf ('define input:inference <%s> DESCRIBE <%s> FROM <%s>', graph, iri, graph); ret := sprintf ('/sparql?query=%U&format=%U', q, acc); return ret; }; create procedure DB.DBA.URL_REW_ODS_USER (in par varchar, in fmt varchar, in val varchar) { -- dbg_obj_print (current_proc_name ()); declare acc, ret any; declare q, iri, graph any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { graph := sioc..get_graph (); iri := sprintf ('%s/%U', graph, val); if (val like 'person/%') { val := substring (val, 8, length (val)); ret := sprintf ('/ods/foaf.vsp?uname=%U&fmt=%U', val, acc); } else ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); } else { http_header (http_header_get ()||sprintf ('X-XRDS-Location: %s\r\n', DB.DBA.wa_link (1, '/dataspace/'||val||'/yadis.xrds'))); if (val like 'person/%') val := substring (val, 8, length (val)); ret := sprintf ('/ods/uhome.vspx?page=1&ufname=%s', val); } return ret; }; create procedure DB.DBA.URL_REW_ODS_USER_GEM (in par varchar, in fmt varchar, in val varchar) { -- dbg_obj_print (current_proc_name ()); declare acc, ret any; declare q, iri, graph, path, is_person any; path := http_path (); if (path like '%.rdf') acc := 'rdf'; else if (path like '%.n3') acc := 'n3'; else if (path like '%.ttl') acc := 'n3'; else if (path like '%/yadis.xrds') acc := 'yadis'; else acc := 'rdf'; if (acc <> 'yadis') { is_person := matches_like (path, '%/about.%'); graph := sioc..get_graph (); if (is_person) { --iri := sprintf ('%s/person/%U', graph, val); ret := sprintf ('/ods/foaf.vsp?uname=%U&fmt=%U', val, acc); } else { iri := sprintf ('%s/%U', graph, val); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); } } else { ret := sprintf ('/ods/yadis.vsp?uname=%U', val); } return ret; }; create procedure DB.DBA.URL_REW_ODS_GEM (in par varchar, in fmt varchar, in val varchar) { -- dbg_obj_print (current_proc_name ()); declare acc, ret any; declare q, iri, graph, path, pos any; path := http_path (); if (path like '%.rdf') acc := 'rdf'; else if (path like '%.n3') acc := 'n3'; else if (path like '%.ttl') acc := 'n3'; else acc := 'rdf'; graph := sioc..get_graph (); pos := strrchr (path, '/'); path := subseq (path, 0, pos); if (val = 'person') { pos := strrchr (path, '/'); val := subseq (path, pos+1, length (path)); ret := sprintf ('/ods/foaf.vsp?uname=%U&fmt=%U', val, acc); } else { iri := sprintf ('http://%s%s', sioc..get_cname (), path); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); } return ret; }; create procedure DB.DBA.URL_REW_ODS_APP (in par varchar, in fmt varchar, in val varchar) { -- dbg_obj_print (current_proc_name (), val); if (par = 'app') return sprintf (fmt, wa_app_to_type (val)); return sprintf (fmt, val); }; create procedure DB.DBA.URL_REW_ODS_BLOG (in par varchar, in fmt varchar, in val varchar) { -- dbg_obj_print (par, fmt, val); -- dbg_obj_print (current_proc_name (), val); declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { if (par = 'inst') { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else return ''; } else if (par = 'inst') { declare url any; val := split_and_decode (val)[0]; url := (SELECT WAM_HOME_PAGE FROM WA_MEMBER WHERE WAM_INST = val AND WAM_MEMBER_TYPE = 1); if (url is not null) val := url; return sprintf (fmt, val); } else if (par = 'id' and val <> '') { if (atoi (val) = 0 and val <> '0') fmt := '%s'; else fmt := '?id=%s'; return sprintf (fmt, val); } }; create procedure DB.DBA.URL_REW_ODS_NNTP (in par varchar, in fmt varchar, in val varchar) { -- dbg_obj_print (par, fmt, val); -- dbg_obj_print (current_proc_name (), val); declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); -- dbg_obj_print (iri); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else if (par = 'grp') { declare gid int; val := split_and_decode (val)[0]; gid := (SELECT NG_GROUP FROM DB.DBA.NEWS_GROUPS WHERE NG_NAME = val); ret := sprintf ('/nntpf/nntpf_nthread_view.vspx?group=%d', gid); return ret; } else if (par = 'post') { ret := sprintf ('/nntpf/nntpf_disp_article.vspx?id=%U', encode_base64 (val)); return ret; } } ; create procedure DB.DBA.URL_REW_ODS_XD (in par varchar, in fmt varchar, in val varchar) { -- dbg_obj_print (par, fmt, val); -- dbg_obj_print (current_proc_name (), val); declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); -- dbg_obj_print (iri); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else if (par = 'inst') { val := split_and_decode (val)[0]; ret := (SELECT WAM_HOME_PAGE FROM WA_MEMBER WHERE WAM_INST = val and WAM_MEMBER_TYPE = 1); return ret; } } ; create procedure DB.DBA.URL_REW_ODS_WIKI (in par varchar, in fmt varchar, in val varchar) { -- dbg_obj_print (par, fmt, val); -- dbg_obj_print (current_proc_name (), val); declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); -- dbg_obj_print (iri); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else if (par = 'inst') { declare _inst DB.DBA.web_app; _inst := (SELECT WAI_INST FROM WA_INSTANCE WHERE WAI_NAME = val); ret := _inst.wa_post_url (null, null, val, val); -- dbg_obj_print ('ret', ret); return ret; } else if (par = 'post') { return '/'||val; } } ; create procedure DB.DBA.URL_REW_ODS_PHOTO (in par varchar, in fmt varchar, in val varchar) { -- dbg_obj_print (par, fmt, val); -- dbg_obj_print (current_proc_name (), val); declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); -- dbg_obj_print (iri); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else if (par = 'inst') { val := split_and_decode (val)[0]; ret := (SELECT WAM_HOME_PAGE FROM WA_MEMBER WHERE WAM_INST = val AND WAM_MEMBER_TYPE = 1); return ret; } else if (par = 'post') { declare id int; declare col, nam varchar; declare exit handler for not found { signal ('22023', sprintf ('The resource %d doesn''t exists', id)); }; id := atoi(ltrim(val, '/')); SELECT RES_FULL_PATH INTO nam FROM WS.WS.SYS_DAV_RES WHERE RES_ID = id; return nam; } } ; create procedure DB.DBA.URL_REW_ODS_ADDRESSBOOK (in par varchar, in fmt varchar, in val varchar) { declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { if (par = 'instance') { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else return ''; } else if (par = 'instance') { declare id, url any; val := split_and_decode (val)[0]; id := AB.WA.domain_id (val); if (id is not null) { url := AB.WA.ab_url (id); if (url is not null) val := url; } return sprintf (fmt, val); } else if (par = 'params') { if (atoi (val) = 0 and val <> '0') fmt := '%s'; else fmt := '?id=%s'; return sprintf (fmt, val); } } ; create procedure DB.DBA.URL_REW_ODS_BOOKMARK (in par varchar, in fmt varchar, in val varchar) { declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { if (par = 'instance') { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else return ''; } else if (par = 'instance') { declare id, url any; val := split_and_decode (val)[0]; id := BMK.WA.domain_id (val); if (id is not null) { url := BMK.WA.bookmark_url (id); if (url is not null) val := url; } return sprintf (fmt, val); } else if (par = 'params') { if (atoi (val) = 0 and val <> '0') fmt := '%s'; else fmt := '?id=%s'; return sprintf (fmt, val); } } ; create procedure DB.DBA.URL_REW_ODS_BRIEFCASE (in par varchar, in fmt varchar, in val varchar) { declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { if (par = 'instance') { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else return ''; } else if (par = 'instance') { declare id, url any; val := split_and_decode (val)[0]; id := ODRIVE.WA.domain_id (val); if (id is not null) { url := ODRIVE.WA.odrive_url (id); if (url is not null) val := url; } return sprintf (fmt, val); } else if (par = 'params') { if (atoi (val) = 0 and val <> '0') fmt := '%s'; else fmt := '?id=%s'; return sprintf (fmt, val); } } ; create procedure DB.DBA.URL_REW_ODS_CALENDAR (in par varchar, in fmt varchar, in val varchar) { declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { if (par = 'instance') { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else return ''; } else if (par = 'instance') { declare id, url any; val := split_and_decode (val)[0]; id := CAL.WA.domain_id (val); if (id is not null) { url := CAL.WA.calendar_url (id); if (url is not null) val := url; } return sprintf (fmt, val); } else if (par = 'params') { if (atoi (val) = 0 and val <> '0') fmt := '%s'; else fmt := '?id=%s'; return sprintf (fmt, val); } } ; create procedure DB.DBA.URL_REW_ODS_FEEDS (in par varchar, in fmt varchar, in val varchar) { declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { if (par = 'instance') { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else return ''; } else if (par = 'instance') { declare id, url any; val := split_and_decode (val)[0]; id := ENEWS.WA.domain_id (val); if (id is not null) { url := ENEWS.WA.enews_url (id) || 'news.vspx'; if (url is not null) val := url; } return sprintf (fmt, val); } else if (par = 'params') { if (atoi (val) = 0 and val <> '0') fmt := '%s'; else fmt := '?id=%s'; return sprintf (fmt, val); } } ; create procedure DB.DBA.URL_REW_ODS_POLLS (in par varchar, in fmt varchar, in val varchar) { declare acc, ret any; acc := DB.DBA.URL_REW_ODS_ACCEPT (); if (acc is not null) { if (par = 'instance') { declare q, iri, graph any; graph := sioc..get_graph (); iri := 'http://' || sioc..get_cname () || http_path (); ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc); return ret; } else return ''; } else if (par = 'instance') { declare id, url any; val := split_and_decode (val)[0]; id := POLLS.WA.domain_id (val); if (id is not null) { url := POLLS.WA.polls_url (id); if (url is not null) val := url; } return sprintf (fmt, val); } else if (par = 'params') { if (atoi (val) = 0 and val <> '0') fmt := '%s'; else fmt := '?id=%s'; return sprintf (fmt, val); } } ; create procedure DB.DBA.URL_REW_ODS_FOAF_EXT (in par varchar, in fmt varchar, in val varchar) { if (par = '*accept*') { declare ext any; ext := 'rdf'; if (val = 'text/rdf+n3') ext := 'n3'; return sprintf (fmt, ext); } else return sprintf (fmt, val); } ; create procedure ur_ods_rdf_doc (in path varchar) { declare r any; r := regexp_match ('[^/]*\x24', path); return r||'#this'; }; create procedure ur_ods_html_doc (in path varchar) { declare pos, r any; if (path like '%/foaf.%') { pos := strrchr (path, '/'); } else if (path like '%#%') { pos := strrchr (path, '#'); } if (pos > 0) r := subseq (path, 0, pos); else r := '/'; return r; }; -- ODS Rules -- http://cname/dataspace/uname -- http://cname/dataspace/person/uname DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule1', 1, '/dataspace/((person/)?[^/#]*)', vector('ufname'), 1, '%s', vector('ufname'), 'DB.DBA.URL_REW_ODS_USER'); -- http://cname/dataspace/uname with Accept will do 303 to the /sparql DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule2', 1, '/dataspace/([^/]*)', vector('ufname'), 1, '/sparql?query=define+input%%3Ainference+%%3Chttp%%3A//^{URIQADefaultHost}^/dataspace%%3E+DESCRIBE+%%3Chttp%%3A//^{URIQADefaultHost}^/dataspace/%U%%3E+FROM+%%3Chttp%%3A//^{URIQADefaultHost}^/dataspace%%3E&format=%U', vector('ufname', '*accept*'), null, '(application|text)/rdf.(xml|n3|turtle|ttl)', 0, 303); -- http://cname/dataspace/uname/app_type DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule3', 1, '/dataspace/((?!person)[^/]*)/([^\\./]*)', vector('ufname', 'app'), 2, '/ods/app_inst.vspx?app=%s&ufname=%s&l=1', vector('app', 'ufname'), 'DB.DBA.URL_REW_ODS_APP'); -- http://cname/dataspace/uname/file.ext DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule4', 1, '/dataspace/([^/]*)/(sioc|about|yadis)\\.(rdf|n3|ttl|xrds)', vector('ufname', 'file', 'fmt'), 3, '%s', vector('ufname'), 'DB.DBA.URL_REW_ODS_USER_GEM'); -- Rules for FOAF profile -- http://cname/dataspace/person/uname with Accept, do 303 to http://cname/dataspace/person/uname/foaf.ext DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule5', 1, '/dataspace/person/([^/#]*)/?', vector('ufname'), 1, '/dataspace/person/%U/foaf.%s', vector('ufname', '*accept*'), 'DB.DBA.URL_REW_ODS_FOAF_EXT', '(application|text)/rdf.(xml|n3|turtle|ttl)', 2, 303); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule6', 1, '/dataspace/person/([^/]*)/page/([^/]*)/?', vector('ufname', 'page'), 1, '/dataspace/person/%U/foaf.%s?page=%s', vector('ufname', '*accept*', 'page'), 'DB.DBA.URL_REW_ODS_FOAF_EXT', '(application|text)/rdf.(xml|n3|turtle|ttl)', 2, 303); -- http://cname/dataspace/person/uname/foaf.ext DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule7', 1, '/dataspace/person/([^/]*)/foaf.(rdf|n3|ttl)', vector('ufname', 'fmt'), 1, '/ods/foaf.vsp?uname=%U&fmt=%U', vector('ufname', 'fmt'), null, null, 2, null); -- App Instance Gem DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_post_gem_rule', 1, '/dataspace/([^/]*)/([^/]*)/([^/]*/)?([^/]*/)?(sioc|about)\\.(rdf|n3|ttl)', vector('ufname', 'app', 'inst'), 4, '%s', vector('ufname'), 'DB.DBA.URL_REW_ODS_GEM'); -- Weblog Rules DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_blog_rule1', 1, '/dataspace/([^/]*)/weblog/([^/]*)', vector('ufname', 'inst'), 2, '%s', vector('inst'), 'DB.DBA.URL_REW_ODS_BLOG'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_blog_rule2', 1, '/dataspace/([^/]*)/weblog/([^/]*)/([^/]*)', vector('ufname', 'inst', 'id'), 3, '%s%s', vector('inst', 'id'), 'DB.DBA.URL_REW_ODS_BLOG'); -- Discussion rules DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_nntp_rule1', 1, '/dataspace/discussion/([^/]*)', vector('grp'), 1, '%s', vector('grp'), 'DB.DBA.URL_REW_ODS_NNTP'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_nntp_rule2', 1, '/dataspace/discussion/([^/]*)/((?!sioc)(?!about)[^/]*)', vector('grp', 'post'), 2, '%s', vector('post'), 'DB.DBA.URL_REW_ODS_NNTP'); -- Community DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_xd_rule1', 1, '/dataspace/([^/]*)/community/([^/]*)', vector('ufname', 'inst'), 2, '%s', vector('inst'), 'DB.DBA.URL_REW_ODS_XD'); -- Wiki DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_wiki_rule1', 1, '/dataspace/([^/]*)/wiki/([^/]*)', vector('ufname', 'inst'), 2, '%s', vector('inst'), 'DB.DBA.URL_REW_ODS_WIKI'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_wiki_rule2', 1, '/dataspace/([^/]*)/wiki/([^/]*)/([^/]*)', vector('ufname', 'inst', 'post'), 2, '%s%s', vector('inst', 'post'), 'DB.DBA.URL_REW_ODS_WIKI'); -- Gallery DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_photo_rule1', 1, '/dataspace/([^/]*)/photos/([^/]*)', vector('ufname', 'inst'), 2, '%s', vector('inst'), 'DB.DBA.URL_REW_ODS_PHOTO'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_photo_rule2', 1, '/dataspace/([^/]*)/photos/([^/]*)/([^/]*)', vector('ufname', 'inst', 'post'), 2, '%s', vector('post'), 'DB.DBA.URL_REW_ODS_PHOTO'); -- AddressBook DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_addressbook_rule1', 1, '/dataspace/([^/]*)/addressbook/([^/]*)', vector('uname', 'instance'), 2, '%s', vector('instance'), 'DB.DBA.URL_REW_ODS_ADDRESSBOOK'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_addressbook_rule2', 1, '/dataspace/([^/]*)/addressbook/([^/]*)/(.*)', vector('uname', 'instance', 'params'), 3, '%s%s', vector('instance', 'params'), 'DB.DBA.URL_REW_ODS_ADDRESSBOOK'); -- Bookmark DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_bookmark_rule1', 1, '/dataspace/([^/]*)/bookmark/([^/]*)', vector('uname', 'instance'), 2, '%s', vector('instance'), 'DB.DBA.URL_REW_ODS_BOOKMARK'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_bookmark_rule2', 1, '/dataspace/([^/]*)/bookmark/([^/]*)/(.*)', vector('uname', 'instance', 'params'), 3, '%s%s', vector('instance', 'params'), 'DB.DBA.URL_REW_ODS_BOOKMARK'); -- Briefcase DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_briefcase_rule1', 1, '/dataspace/([^/]*)/briefcase/([^/]*)', vector('uname', 'instance'), 2, '%s', vector('instance'), 'DB.DBA.URL_REW_ODS_BRIEFCASE'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_briefcase_rule2', 1, '/dataspace/([^/]*)/briefcase/([^/]*)/(.*)', vector('uname', 'instance', 'params'), 3, '%s%s', vector('instance', 'params'), 'DB.DBA.URL_REW_ODS_BRIEFCASE'); -- Calendar DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_calendar_rule1', 1, '/dataspace/([^/]*)/calendar/([^/]*)', vector('uname', 'instance'), 2, '%s', vector('instance'), 'DB.DBA.URL_REW_ODS_CALENDAR'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_calendar_rule2', 1, '/dataspace/([^/]*)/calendar/([^/]*)/(.*)', vector('uname', 'instance', 'params'), 3, '%s%s', vector('instance', 'params'), 'DB.DBA.URL_REW_ODS_CALENDAR'); -- Feeds DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_feeds_rule1', 1, '/dataspace/([^/]*)/feeds/([^/]*)', vector('uname', 'instance'), 2, '%s', vector('instance'), 'DB.DBA.URL_REW_ODS_FEEDS'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_feeds_rule2', 1, '/dataspace/([^/]*)/feeds/([^/]*)/(.*)', vector('uname', 'instance', 'params'), 3, '%s%s', vector('instance', 'params'), 'DB.DBA.URL_REW_ODS_FEEDS'); -- Polls DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_polls_rule1', 1, '/dataspace/([^/]*)/polls/([^/]*)', vector('uname', 'instance'), 2, '%s', vector('instance'), 'DB.DBA.URL_REW_ODS_POLLS'); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ods_polls_rule2', 1, '/dataspace/([^/]*)/polls/([^/]*)/(.*)', vector('uname', 'instance', 'params'), 3, '%s%s', vector('instance', 'params'), 'DB.DBA.URL_REW_ODS_POLLS'); -- ODS Base rules DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_base_rule_list1', 1, vector( 'ods_rule1', 'ods_rule2', 'ods_rule3', 'ods_rule4' )); DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_foaf_rule_list1', 1, vector( 'ods_rule5', 'ods_rule6', 'ods_rule7' )); DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_gems_rule_list1', 1, vector( 'ods_post_gem_rule' )); -- ODS Blog rules DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_blog_rule_list1', 1, vector( 'ods_blog_rule1', 'ods_blog_rule2' )); -- ODS Discussion rules DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_nntp_rule_list1', 1, vector( 'ods_nntp_rule1', 'ods_nntp_rule2' )); -- ODS Community rules DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_xd_rule_list1', 1, vector( 'ods_xd_rule1' )); -- ODS Wiki rules DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_wiki_rule_list1', 1, vector( 'ods_wiki_rule1', 'ods_wiki_rule2' )); -- ODS Gallery rules DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_photo_rule_list1', 1, vector( 'ods_photo_rule1', 'ods_photo_rule2' )); -- ODS AddressBook rules DB.DBA.URLREWRITE_CREATE_RULELIST ( 'ods_addressbook_rule_list1', 1, vector ( 'ods_addressbook_rule1', 'ods_addressbook_rule2' )); -- ODS Bookmark rules DB.DBA.URLREWRITE_CREATE_RULELIST ( 'ods_bookmark_rule_list1', 1, vector ( 'ods_bookmark_rule1', 'ods_bookmark_rule2' )); -- ODS Briefcase rules DB.DBA.URLREWRITE_CREATE_RULELIST ( 'ods_briefcase_rule_list1', 1, vector ( 'ods_briefcase_rule1', 'ods_briefcase_rule2' )); -- ODS Calendar rules DB.DBA.URLREWRITE_CREATE_RULELIST ( 'ods_calendar_rule_list1', 1, vector ( 'ods_calendar_rule1', 'ods_calendar_rule2' )); -- ODS Feeds rules DB.DBA.URLREWRITE_CREATE_RULELIST ( 'ods_feeds_rule_list1', 1, vector ( 'ods_feeds_rule1', 'ods_feeds_rule2' )); -- ODS Polls rules DB.DBA.URLREWRITE_CREATE_RULELIST ( 'ods_polls_rule_list1', 1, vector ( 'ods_polls_rule1', 'ods_polls_rule2' )); -- All ODS Rules DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_rule_list1', 1, vector( 'ods_base_rule_list1', 'ods_foaf_rule_list1', 'ods_blog_rule_list1', 'ods_nntp_rule_list1', 'ods_xd_rule_list1', 'ods_wiki_rule_list1', 'ods_photo_rule_list1', 'ods_addressbook_rule_list1', 'ods_bookmark_rule_list1', 'ods_briefcase_rule_list1', 'ods_calendar_rule_list1', 'ods_feeds_rule_list1', 'ods_polls_rule_list1', 'ods_gems_rule_list1' )); DB.DBA.XML_SET_NS_DECL ('ods', 'http://www.openlinksw.com/virtuoso/ods/', 2);
-- Setup script for RDF view of OpenLink Product Portfolio version 2 -- /* * This view is currently designed to SPECIFICALLY load on data.openlinksw.com. We recommend you * search for `openlinksw.com' (as `http://' is sometimes encoded) and replace with either the default * URIQA macro or your own hostname as appropriate. */ -- views to get the codes out instead of the id's ---- in hindsight these should ALL have been handled with ---- proper IRI functions like the rest, oh well, no harm AFAIK ---- will know for next time or might even replace this later. DROP VIEW oplweb2.oplweb.product_formats_categories; CREATE VIEW oplweb2.oplweb.product_formats_categories ( product_cat_code, product_cat_id, product_format_code, product_format_id, product_family_id ) as SELECT distinct pc.product_cat_code, pc.product_cat_id, pf.product_format_code, pf.product_format_id, pc.product_family_id FROM oplweb2.oplweb.product_category pc, oplweb2.oplweb.product_format pf, oplweb2.oplweb.product p WHERE p.product_cat_id = pc.product_cat_id and p.product_format_id = pf.product_format_id AND EXISTS ( SELECT 1 FROM oplweb2.oplweb.component_archive ca WHERE ca.product_id = p.product_id ) ; DROP VIEW oplweb2.oplweb.product_with_code; CREATE VIEW oplweb2.oplweb.product_with_code as SELECT p.*, pc.product_cat_code, pf.product_format_code FROM oplweb2.oplweb.product_category pc, oplweb2.oplweb.product_format pf, oplweb2.oplweb.product p WHERE p.product_cat_id = pc.product_cat_id and p.product_format_id = pf.product_format_id ; DROP VIEW oplweb2.oplweb.product_category_with_code; CREATE VIEW oplweb2.oplweb.product_category_with_code as SELECT pc.*, pf.product_family_code from oplweb2.oplweb.product_category pc, oplweb2.oplweb.product_family pf where pc.product_family_id = pf.product_family_id ; DROP VIEW oplweb2.oplweb.product_family_features_with_code; CREATE VIEW oplweb2.oplweb.product_family_features_with_code as SELECT a.*, b.product_family_code from oplweb2.oplweb.product_family_features a, oplweb2.oplweb.product_family b where a.product_family_id = b.product_family_id ; DROP VIEW oplweb2.oplweb.product_format_features_with_code; CREATE VIEW oplweb2.oplweb.product_format_features_with_code as SELECT a.*, b.product_format_code from oplweb2.oplweb.product_format_features a, oplweb2.oplweb.product_format b where a.product_format_id = b.product_format_id ; DROP VIEW oplweb2.oplweb.product_category_features_with_code; CREATE VIEW oplweb2.oplweb.product_category_features_with_code as SELECT a.*, b.product_cat_code from oplweb2.oplweb.product_category_features a, oplweb2.oplweb.product_category b where a.product_cat_id = b.product_cat_id ; DROP VIEW oplweb2.oplweb.components_for_rdfs; CREATE VIEW oplweb2.oplweb.components_for_rdfs as SELECT *, cast(filesize as varchar) as str_filesize from oplweb2.oplweb.components ; DROP VIEW oplweb2.oplweb.product_release_with_family; CREATE VIEW oplweb2.oplweb.product_release_with_family as SELECT a.*, b.opsys_family_id, c.dbms_family_id from oplweb2.oplweb.product_release a, oplweb2.oplweb.opsys b, oplweb2.oplweb.dbms_engine c where a.opsys_name = b.opsys_name and a.dbms_name = c.dbms_name ; drop view oplweb2.oplweb.archive_coverage_osdb; create view oplweb2.oplweb.archive_coverage_osdb as SELECT distinct pfam.product_family_id, pfam.product_family_code, p.product_format_id, pf.product_format_code, p.product_cat_id, pc.product_cat_code, p.product_id, ca.opsys_name, os.opsys_family_id, ca.dbms_name, db.dbms_family_id, pr.processor_name, pr.processor_mode_id, pr.processor_family_id from oplweb2.oplweb.product p join oplweb2.oplweb.product_category pc on (p.product_cat_id = pc.product_cat_id) join oplweb2.oplweb.product_format pf on (p.product_format_id = pf.product_format_id) join oplweb2.oplweb.product_family pfam on (pc.product_family_id = pfam.product_family_id) join oplweb2.oplweb.component_archive ca on (ca.product_id = p.product_id) join oplweb2.oplweb.opsys os on (os.opsys_name = ca.opsys_name) join oplweb2.oplweb.dbms_engine db on (db.dbms_name = ca.dbms_name) join oplweb2.oplweb.processors pr on (pr.processor_name = os.processor_name and pr.processor_mode_id = os.processor_mode_id) ; GRANT SELECT ON oplweb2.oplweb.component_archive TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.component_archive_type TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.component_category TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.component_mode TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.component_type TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.components TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.components_for_rdfs TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.dbms_engine TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.dbms_family TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.download_location TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.download_protocol TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.download_partner TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.opsys TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.opsys_family TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.opsys_type TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.processor_family TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.processor_mode TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.processors TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_benefits TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_benefits_category TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_category TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_category_with_code TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_category_features TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_family TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_family_features TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_features TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_format TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_format_features TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_feature_category TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_release TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_release_features TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.vendor_category TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.vendor_category_family TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.vendors TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_formats_categories TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_with_code TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_family_features_with_code TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_format_features_with_code TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_category_features_with_code TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.product_release_with_family TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON oplweb2.oplweb.archive_coverage_osdb TO "SPARQL", "SPARQL_UPDATE"; drop index oplweb2_product_price_format_cat; create index oplweb2_product_price_format_cat on oplweb2.oplweb.product_price(product_cat_id, product_format_id, product_price_type_id); drop index oplweb2_product_discount_format_cat; create index oplweb2_product_discount_format_cat on oplweb2.oplweb.product_general_discount(product_cat_id, product_format_id, product_price_type_id); drop view oplweb2.DBA.license_model_type; create view oplweb2.DBA.license_model_type ( product_release_id, product_cat_id, product_format_id, product_id, product_price_type_id ) as SELECT distinct product_release_id, pp.product_cat_id, pp.product_format_id, product_id, product_price_type_id FROM oplweb2.oplweb.product_price pp, oplweb2.oplweb.product p WHERE p.product_cat_id = pp.product_cat_id AND p.product_format_id = pp.product_format_id ; grant SELECT on oplweb2.DBA.license_model_type to "SPARQL", "SPARQL_UPDATE";--, rdf; drop view oplweb2.DBA.license_model; create view oplweb2.DBA.license_model as SELECT distinct product_release_id, pc.product_cat_id, pc.product_format_id, pc.product_cat_code, pc.product_format_code, pc.product_id, pp.opsys_family_id, pp.dbms_family_id, replace(oo.opsys_family_name, ' ', '') as opsys_family_name, replace(dd.dbms_family_name, ' ', '') as dbms_family_name, pp.opsys_type_id, pp.product_price_type_id, pp.product_price_unit_type_id from oplweb2.oplweb.product_price pp, oplweb2.oplweb.product_with_code pc, --category pc, --oplweb2.oplweb.product_format pf, oplweb2.oplweb.opsys os, oplweb2.oplweb.dbms_engine dbe, oplweb2.oplweb.dbms_family dd, oplweb2.oplweb.opsys_family oo --oplweb2.oplweb.product p where pp.product_format_id = pc.product_format_id and pp.product_cat_id = pc.product_cat_id and pp.opsys_family_id = oo.opsys_family_id and pp.dbms_family_id = dd.dbms_family_id --p.product_cat_id = pc.product_cat_id and --p.product_format_id = pf.product_format_id and ; grant SELECT on oplweb2.DBA.license_model to "SPARQL", "SPARQL_UPDATE";--, rdf; drop view oplweb2.DBA.license_model_units; create view oplweb2.DBA.license_model_units as SELECT distinct lm1.product_release_id, lm1.product_id, lm1.opsys_family_ pp.opsys_family_id, pp.dbms_family_id, replace(oo.opsys_family_name, ' ', '') as opsys_family_name, replace(dd.dbms_family_name, ' ', '') as dbms_family_name, pp.opsys_type_id, ot.short_description as opsys_type_code from oplweb2.oplweb.product_price pp, oplweb2.oplweb.opsys_type ot, oplweb2.oplweb.dbms_family dd, oplweb2.oplweb.opsys_family oo where pp.opsys_type_id = ot.opsys_type_id and pp.opsys_family_id = oo.opsys_family_id and pp.dbms_family_id = dd.dbms_family_id and pp.product_release_id = '6.1' ; grant SELECT on oplweb2.DBA.license_model_units to "SPARQL", "SPARQL_UPDATE";--, rdf; drop view oplweb2.DBA.product_general_discount_vc; create view oplweb2.DBA.product_general_discount_vc as SELECT distinct product_release_id, pgd.product_cat_id, pc.product_cat_code, pgd.product_format_id, pc.product_format_code, pc.product_id, pgd.opsys_family_id, pgd.dbms_family_id, pgd.opsys_type_id, product_discount_description, product_price_type_id, cast(unit_discount as varchar) as unit_discount, discount_start, discount_end, discount_token from oplweb2.oplweb.product_general_discount pgd, oplweb2.oplweb.product_with_code pc where pgd.product_format_id = pc.product_format_id and pgd.product_cat_id = pc.product_cat_id ; drop view oplweb2.DBA.product_price_varchar; create view oplweb2.DBA.product_price_varchar as select pp.product_price_id, pp.product_release_id, pp.product_cat_id, pc.product_cat_code, pp.product_format_id, pf.product_format_code, pp.opsys_family_id, pp.dbms_family_id, replace(oo.opsys_family_name, ' ', '') as opsys_family_name, replace(dd.dbms_family_name, ' ', '') as dbms_family_name, pp.opsys_type_id, ot.short_description as opsys_type_code, pp.product_price_type_id, pp.product_price_unit_type_id, cast(pp.unit_price as varchar) as unit_price, pp.component_archive_available from oplweb2.oplweb.product_price pp, oplweb2.oplweb.product_category pc, oplweb2.oplweb.product_format pf, oplweb2.oplweb.opsys_type ot, oplweb2.oplweb.dbms_family dd, oplweb2.oplweb.opsys_family oo where pp.product_format_id = pf.product_format_id and pp.product_cat_id = pc.product_cat_id and pp.opsys_type_id = ot.opsys_type_id and pp.opsys_family_id = oo.opsys_family_id and pp.dbms_family_id = dd.dbms_family_id --and --pp.product_release_id = '6.1' ; grant SELECT on oplweb2.oplweb.product_price to "SPARQL", "SPARQL_UPDATE";--, rdf; grant SELECT on oplweb2.oplweb.product_price_type to "SPARQL", "SPARQL_UPDATE";--, rdf; grant SELECT on oplweb2.oplweb.product_price_unit_type to "SPARQL", "SPARQL_UPDATE";--, rdf; grant SELECT on oplweb2.DBA.product_general_discount_vc to "SPARQL", "SPARQL_UPDATE";--, rdf; grant SELECT on oplweb2.DBA.product_price_varchar to "SPARQL", "SPARQL_UPDATE";--, rdf; grant SELECT on oplweb2.DBA.license_model_type to "SPARQL", "SPARQL_UPDATE";--, rdf; DB.DBA.RDF_AUDIT_METADATA (1, '*'); --DB.DBA.RDF_AUDIT_METADATA (2, '*'); --sparql drop graph <http://www.openlinksw.com/dataspace/organization/openlink/ProductPortfolioOntology/1.0/>; --possible previous graph now merging with this oplweb graph sparql drop graph <http://data.openlinksw.com/shop_pricing/>; --others that have a dependency on this graph that may need kicking first --sparql drop graph <http://data.openlinksw.com/customer/>; --sparql drop graph <http://data.openlinksw.com/support/>; --sparql drop graph <http://data.openlinksw.com/shop_pricing/>; SPARQL drop graph <http://www.openlinksw.com/schemas/oplweb#> ; SPARQL drop graph <http://www.openlinksw.com/dataspace/organization/openlink/oplweb#> ; SPARQL drop graph <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> ; -- should now use <http://www.openlinksw.com/dataspace/organization/openlink#this> SPARQL drop quad map virtrdf:product_portfolio ; --only use this if you really really mean it, it will totally nuke your RDF data, useful on --test boxes in a bit of jam (hasn't happened to me for a while now) --rdf_global_reset(); --utility for stripping url killing stuff from friendly strings used as ids create function oplweb2.oplweb.FIXUP4URI (in _string varchar) returns varchar { declare _s varchar; _s := replace (_string, ' ', ''); _s := replace (_s, '&', '_'); _s := replace (_s, '/', ''); return _s; } ; --URI-IRI mapping functions create function oplweb2.oplweb.DOWNLOAD_LOCATION_URI (in uri varchar) returns varchar { return sprintf('http://data.openlinksw.com/oplweb/download_location/%s#this', replace(uri, 'http://', '')); }; create function oplweb2.oplweb.DOWNLOAD_LOCATION_URI_INVERSE (in dl_iri varchar) returns varchar { declare parts any; parts := sprintf_inverse(dl_iri, 'http://data.openlinksw.com/oplweb/download_location/%s#this', 1); if (parts is not null) { return sprintf('http://%s', parts[0]); } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.DOWNLOAD_LOCATION_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.DOWNLOAD_LOCATION_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.DBMS_FAMILY_URI (in _family_id integer) returns varchar { declare _family_string varchar; SELECT dbms_family_name into _family_string FROM oplweb2.oplweb.dbms_family WHERE dbms_family_id = _family_id ; return sprintf('http://data.openlinksw.com/oplweb/dbms_family/%s#this', oplweb2.oplweb.FIXUP4URI(_family_string)); }; create function oplweb2.oplweb.DBMS_FAMILY_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _family_id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/dbms_family/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 dbms_family_id into _family_id FROM oplweb2.oplweb.dbms_family WHERE lower(oplweb2.oplweb.FIXUP4URI(dbms_family_name)) = lower(parts[0]); return _family_id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.DBMS_FAMILY_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.DBMS_FAMILY_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.COMPONENT_CATEGORY_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_description into _string FROM oplweb2.oplweb.component_category WHERE component_category_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/component_category/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.COMPONENT_CATEGORY_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/component_category/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 component_category_id into _id FROM oplweb2.oplweb.component_category WHERE lower(oplweb2.oplweb.FIXUP4URI(short_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.COMPONENT_CATEGORY_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.COMPONENT_CATEGORY_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.COMPONENT_MODE_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_description into _string FROM oplweb2.oplweb.component_mode WHERE component_mode_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/component_mode/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.COMPONENT_MODE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/component_mode/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 component_mode_id into _id FROM oplweb2.oplweb.component_mode WHERE lower(oplweb2.oplweb.FIXUP4URI(short_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.COMPONENT_MODE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.COMPONENT_MODE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.COMPONENT_TYPE_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_description into _string FROM oplweb2.oplweb.component_type WHERE component_type_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/component_type/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.COMPONENT_TYPE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/component_type/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 component_type_id into _id FROM oplweb2.oplweb.component_type WHERE lower(oplweb2.oplweb.FIXUP4URI(short_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.COMPONENT_TYPE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.COMPONENT_TYPE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.COMPONENT_ARCHIVE_TYPE_URI (in _id integer) returns varchar { declare _string varchar; SELECT component_archive_short_name into _string FROM oplweb2.oplweb.component_archive_type WHERE component_archive_type_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/component_archive_type/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.COMPONENT_ARCHIVE_TYPE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/component_archive_type/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 component_archive_type_id into _id FROM oplweb2.oplweb.component_archive_type WHERE lower(oplweb2.oplweb.FIXUP4URI(component_archive_short_name)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.COMPONENT_ARCHIVE_TYPE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.COMPONENT_ARCHIVE_TYPE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.FEATURE_BENEFIT_URI (in _id integer) returns varchar { declare _string varchar; SELECT product_benefit_desc into _string FROM oplweb2.oplweb.product_benefits WHERE product_benefit_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/feature_benefit/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.FEATURE_BENEFIT_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/feature_benefit/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 product_benefit_id into _id FROM oplweb2.oplweb.product_benefits WHERE lower(oplweb2.oplweb.FIXUP4URI(product_benefit_desc)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.FEATURE_BENEFIT_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.FEATURE_BENEFIT_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.OPSYS_FAMILY_URI (in _id integer) returns varchar { declare _string varchar; SELECT opsys_family_name into _string FROM oplweb2.oplweb.opsys_family WHERE opsys_family_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/opsys_family/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.OPSYS_FAMILY_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/opsys_family/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 opsys_family_id into _id FROM oplweb2.oplweb.opsys_family WHERE lower(oplweb2.oplweb.FIXUP4URI(opsys_family_name)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.OPSYS_FAMILY_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.OPSYS_FAMILY_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.OPSYS_TYPE_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_description into _string FROM oplweb2.oplweb.opsys_type WHERE opsys_type_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/opsys_type/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.OPSYS_TYPE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/opsys_type/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT TOP 1 opsys_type_id into _id FROM oplweb2.oplweb.opsys_type WHERE lower(oplweb2.oplweb.FIXUP4URI(short_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.OPSYS_TYPE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.OPSYS_TYPE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.PROCESSOR_FAMILY_URI (in _id integer) returns varchar { declare _string varchar; SELECT processor_family_name into _string FROM oplweb2.oplweb.processor_family WHERE processor_family_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/processor_family/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PROCESSOR_FAMILY_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/processor_family/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 processor_family_id into _id FROM oplweb2.oplweb.processor_family WHERE lower(oplweb2.oplweb.FIXUP4URI(processor_family_name)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PROCESSOR_FAMILY_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PROCESSOR_FAMILY_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; --FIXME might have to do something with possible & symbols create function oplweb2.oplweb.PROCESSOR_MODE_URI (in _id integer) returns varchar { declare _string varchar; SELECT processor_mode_name into _string FROM oplweb2.oplweb.processor_mode where processor_mode_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/processor_mode/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PROCESSOR_MODE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/processor_mode/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 processor_mode_id into _id FROM oplweb2.oplweb.processor_mode WHERE lower(oplweb2.oplweb.FIXUP4URI(processor_mode_name)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PROCESSOR_MODE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PROCESSOR_MODE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.PRODUCT_CATEGORY_FEATURE_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_description into _string FROM oplweb2.oplweb.product_category_features WHERE product_category_feature_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/product_category_feature/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PRODUCT_CATEGORY_FEATURE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/product_category_feature/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 product_category_feature_id into _id FROM oplweb2.oplweb.product_category_features WHERE lower(oplweb2.oplweb.FIXUP4URI(short_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_CATEGORY_FEATURE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_CATEGORY_FEATURE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.PRODUCT_FAMILY_FEATURE_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_description into _string FROM oplweb2.oplweb.product_family_features WHERE product_family_feature_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/product_family_feature/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PRODUCT_FAMILY_FEATURE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/product_family_feature/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 product_family_feature_id into _id FROM oplweb2.oplweb.product_family_features WHERE lower(oplweb2.oplweb.FIXUP4URI(short_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_FAMILY_FEATURE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_FAMILY_FEATURE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.PRODUCT_FEATURE_CATEGORY_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_desc into _string FROM oplweb2.oplweb.product_feature_category WHERE product_feature_category_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/product_feature_category/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PRODUCT_FEATURE_CATEGORY_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/product_feature_category/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 product_feature_category_id into _id FROM oplweb2.oplweb.product_feature_category WHERE lower(oplweb2.oplweb.FIXUP4URI(short_desc)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_FEATURE_CATEGORY_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_FEATURE_CATEGORY_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.PRODUCT_FEATURE_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_description into _string FROM oplweb2.oplweb.product_features WHERE product_feature_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/product_feature/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PRODUCT_FEATURE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/product_feature/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 product_feature_id into _id FROM oplweb2.oplweb.product_features WHERE lower(oplweb2.oplweb.FIXUP4URI(short_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_FEATURE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_FEATURE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.PRODUCT_FORMAT_FEATURE_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_description into _string FROM oplweb2.oplweb.product_format_features WHERE product_format_feature_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/product_format_feature/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PRODUCT_FORMAT_FEATURE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/product_format_feature/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 product_format_feature_id into _id FROM oplweb2.oplweb.product_format_features WHERE lower(oplweb2.oplweb.FIXUP4URI(short_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_FORMAT_FEATURE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_FORMAT_FEATURE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.PRODUCT_RELEASE_FEATURE_URI (in _id integer) returns varchar { declare _string varchar; SELECT short_description into _string FROM oplweb2.oplweb.product_release_features WHERE product_release_feature_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/product_release_feature/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PRODUCT_RELEASE_FEATURE_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/product_release_feature/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 product_release_feature_id into _id FROM oplweb2.oplweb.product_release_features WHERE lower(oplweb2.oplweb.FIXUP4URI(short_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_RELEASE_FEATURE_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_RELEASE_FEATURE_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.PRODUCT_BENEFIT_URI (in _id integer) returns varchar { declare _string varchar; SELECT product_benefit_desc into _string FROM oplweb2.oplweb.product_benefits WHERE product_benefit_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/product_benefit/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PRODUCT_BENEFIT_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/product_benefit/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 product_benefit_id into _id FROM oplweb2.oplweb.product_benefits WHERE lower(oplweb2.oplweb.FIXUP4URI(product_benefit_desc)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_BENEFIT_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_BENEFIT_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.PRODUCT_BENEFIT_CATEGORY_URI (in _id integer) returns varchar { declare _string varchar; SELECT description into _string FROM oplweb2.oplweb.product_benefits_category WHERE product_benefit_category_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/product_benefit_category/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.PRODUCT_BENEFIT_CATEGORY_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/product_benefit_category/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 product_benefit_category_id into _id FROM oplweb2.oplweb.product_benefits_category WHERE lower(oplweb2.oplweb.FIXUP4URI(description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_BENEFIT_CATEGORY_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.PRODUCT_BENEFIT_CATEGORY_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.VENDOR_URI (in _id integer) returns varchar { declare _string varchar; SELECT vendor_name into _string FROM oplweb2.oplweb.vendors where vendor_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/vendor/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.VENDOR_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/vendor/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 vendor_id into _id FROM oplweb2.oplweb.vendors WHERE lower(oplweb2.oplweb.FIXUP4URI(vendor_name)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.VENDOR_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.VENDOR_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.VENDOR_CATEGORY_URI (in _id integer) returns varchar { declare _string varchar; SELECT vendor_category_description into _string FROM oplweb2.oplweb.vendor_category where vendor_category_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/vendor_category/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.VENDOR_CATEGORY_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/vendor_category/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 vendor_category_id into _id FROM oplweb2.oplweb.vendor_category WHERE lower(oplweb2.oplweb.FIXUP4URI(vendor_category_description)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.VENDOR_CATEGORY_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.VENDOR_CATEGORY_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.VENDOR_CATEGORY_FAMILY_URI (in _id integer) returns varchar { declare _string varchar; SELECT vendor_category_family_desc into _string FROM oplweb2.oplweb.vendor_category_family where vendor_category_family_id = _id ; return sprintf('http://data.openlinksw.com/oplweb/vendor_category_family/%s#this', oplweb2.oplweb.FIXUP4URI(_string)); }; create function oplweb2.oplweb.VENDOR_CATEGORY_FAMILY_URI_INVERSE (in _iri varchar) returns integer { declare parts any; declare _id integer; parts := sprintf_inverse(_iri, 'http://data.openlinksw.com/oplweb/vendor_category_family/%s#this', 1); if (parts is not null) { declare exit handler for not found return null; SELECT top 1 vendor_category_family_id into _id FROM oplweb2.oplweb.vendor_category_family WHERE lower(oplweb2.oplweb.FIXUP4URI(vendor_category_family_desc)) = lower(parts[0]); return _id; } return NULL; }; GRANT EXECUTE ON oplweb2.oplweb.VENDOR_CATEGORY_FAMILY_URI TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON oplweb2.oplweb.VENDOR_CATEGORY_FAMILY_URI_INVERSE TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.LIT_PRODUCT_RELEASE_LABEL ( in _product_id varchar, in _id integer, in _opsys_name varchar, in _dbms_name varchar ) returns varchar { declare _string varchar; SELECT 'OpenLink ' || poduct_description || ' (Release ' || product_release_id || ') on ' || commercial_name into _string FROM oplweb2.oplweb.product_release pr, oplweb2.oplweb.product p, oplweb2.oplweb.opsys o where p.product_id = pr.product_id and o.opsys_name = pr.opsys_name and pr.product_release_id = _id and pr.product_id = _product_id and pr.opsys_name = _opsys_name and pr.dbms_name = _dbms_name ; return _string; }; GRANT EXECUTE ON oplweb2.oplweb.LIT_PRODUCT_RELEASE_LABEL TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.LIT_FORMAT_CAT_LABEL ( in _format integer, in _cat integer ) returns varchar { declare _string varchar; SELECT top 1 'OpenLink ' || cast(product_format_description as varchar) || ' ' || cast(product_category_description as varchar) into _string from oplweb2.oplweb.product_formats_categories fc, oplweb2.oplweb.product_format f, oplweb2.oplweb.product_category c where fc.product_format_id = f.product_format_id and fc.product_cat_id = c.product_cat_id and fc.product_format_id = _format and fc.product_cat_id = _cat; return _string; }; GRANT EXECUTE ON oplweb2.oplweb.LIT_FORMAT_CAT_LABEL TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.LITRDF_openlink_logo (in _code varchar) returns varchar { declare _string varchar; SELECT top 1 product_family_logo_url into _string FROM oplweb2.oplweb.product_family WHERE product_family_code = _code; return _string; }; GRANT EXECUTE ON oplweb2.oplweb.LITRDF_openlink_logo TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.LITRDF_homepage (in _code varchar) returns varchar { declare _string varchar; SELECT top 1 product_family_homepage into _string FROM oplweb2.oplweb.product_family WHERE product_family_code = _code; return _string; }; GRANT EXECUTE ON oplweb2.oplweb.LITRDF_homepage TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.LITRDF_opsys_icon (in _id integer) returns varchar { declare _string varchar; _string := ''; SELECT top 1 opsys_icon_name into _string FROM oplweb2.oplweb.opsys_family where opsys_family_id = _id; _string := 'http://download.openlinksw.com/download/images/'||_string; return _string; }; GRANT EXECUTE ON oplweb2.oplweb.LITRDF_opsys_icon TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.LITRDF_to_shop ( in release_id varchar, in product_id varchar, in opsys varchar, in dbms varchar ) returns varchar { declare _string varchar; _string := ''; declare _cat, _format, _prod varchar; _prod := product_id; SELECT top 1 cast(product_cat_id as varchar), cast(product_format_id as varchar) into _cat, _format FROM oplweb2.oplweb.product p WHERE p.product_id = _prod; _string := sprintf( 'https://shop.openlinksw.com/?product_release_id=%s&product=%s&product_cat=%V&product_format=%V&os=%s&db=%s&buyme=yes', release_id, product_id, _cat, _format, opsys, dbms ); return _string; }; GRANT EXECUTE ON oplweb2.oplweb.LITRDF_to_shop TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.LITRDF_license_model_type ( in _product_price_type_id integer ) returns varchar { declare _string varchar; _string := ''; SELECT top 1 product_price_type_description into _string FROM oplweb2.oplweb.product_price_type WHERE product_price_type_id = _product_price_type_id; return _string || ' License'; }; GRANT EXECUTE ON oplweb2.oplweb.LITRDF_license_model_type TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.LITRDF_license_model_explain ( in _product_price_type_id integer ) returns varchar { declare _string varchar; _string := ''; SELECT top 1 product_price_type_long_description into _string FROM oplweb2.oplweb.product_price_type WHERE product_price_type_id = _product_price_type_id; return _string; }; GRANT EXECUTE ON oplweb2.oplweb.LITRDF_license_model_explain TO "SPARQL", "SPARQL_UPDATE"; create function oplweb2.oplweb.LITRDF_shop_sample ( in release_id varchar, in product_id varchar, in opsys varchar, in dbms varchar ) returns varchar { declare _string varchar; _string := ''; declare _cat, _format, _prod, _pricetype varchar; _prod := product_id; SELECT top 1 cast(product_cat_id as varchar), cast(product_format_id as varchar), cast(product_price_type_id as varchar) into _cat, _format, _pricetype FROM oplweb2.DBA.license_model p, oplweb2.oplweb.opsys o, oplweb2.oplweb.dbms_engine e WHERE p.product_id = _prod and product_release_id = release_id and o.opsys_name = opsys and e.dbms_name = dbms and p.dbms_family_id = e.dbms_family_id and o.opsys_family_id = p.opsys_family_id; _string := sprintf( 'https://shop.openlinksw.com/price_calc.vsp?release=%s&cat=%V&format=%V&os=%s&db=%s&lictype=%V', release_id, _cat, _format, opsys, dbms, _pricetype ); return http_client(_string); }; GRANT EXECUTE ON oplweb2.oplweb.LITRDF_shop_sample TO "SPARQL", "SPARQL_UPDATE"; -- $Id: rdfandsparql.xml,v 1.95.2.31 2010/03/30 17:59:29 source Exp $ -- Setup script for RDF view of OpenLink Product Portfolio version 2 -- -- -- This view is currently designed to SPECIFICALLY load on data.openlinksw.com. The default URI macro has NOT -- been used here because it makes no sense on the target box which is actually my.usnet.private:8891 or -- something similar. If you want to use this view on another box, a simple search-replace should do the trick, -- but search-replace just`data.openlinksw.com' because http:// is sometimes encoded and you would miss it. -- -- SPARQL drop quad map virtrdf:product_portfolio2 ; SPARQL drop quad map virtrdf:product_portfolio ; SPARQL prefix opl: <http://www.openlinksw.com/schemas/oplweb#> drop iri class opl:DownloadLocation . drop iri class opl:ComponentCategory . drop iri class opl:Component . drop iri class opl:ComponentArchive . drop iri class opl:ComponentArchiveType . drop iri class opl:ComponentCategory . drop iri class opl:ComponentMode . drop iri class opl:ComponentType . drop iri class opl:DbmsEngine . drop iri class opl:DbmsFamily . drop iri class opl:DownloadProtocol . drop iri class opl:DownloadPartner . drop iri class opl:FeatureBenefit . drop iri class opl:Opsys . drop iri class opl:OpsysFamily . drop iri class opl:OpsysType . drop iri class opl:Processor . drop iri class opl:ProcessorFamily . drop iri class opl:ProcessorMode . drop iri class opl:ProductRelease . drop iri class opl:Product . drop iri class opl:ProductCategory . drop iri class opl:ProductCategoryFeature . drop iri class opl:ProductPortfolio . drop iri class opl:ProductFamily . drop iri class opl:ProductFamilyFeature . drop iri class opl:ProductFeatureCategory . drop iri class opl:ProductFeature . drop iri class opl:ProductFormat . drop iri class opl:ProductFormatCategory . drop iri class opl:ProductFormatFeature . drop iri class opl:ProductReleaseFeature . drop iri class opl:ProductBenefit . drop iri class opl:ProductBenefitCategory . drop iri class opl:Vendor . drop iri class opl:VendorCategory . drop iri class opl:VendorCategoryFamily . drop iri class opl:PriceType . drop iri class opl:PriceUnitType . drop iri class opl:PriceUnitIncrementalDiscount . drop iri class opl:ProductPrice . drop iri class opl:LicenseType . drop iri class opl:LicenseModel . drop iri class opl:LicenseClass . drop iri class opl:Discount . drop literal class opl:lit_product_release_label . drop literal class opl:lit_format_cat_label . drop literal class opl:lit_openlink_logo . drop iri class opl:lit_openlink_logo . drop literal class opl:lit_homepage . drop iri class opl:lit_homepage . drop literal class opl:lit_opsys_icon . drop iri class opl:lit_opsys_icon . drop literal class opl:lit_to_shop . drop iri class opl:lit_to_shop . drop literal class opl:lit_license_model_type . drop literal class opl:lit_license_model_explain . drop literal class opl:lit_shop_sample . drop literal class opl:lit_wikipedia_to_dbpedia . drop iri class opl:lit_wikipedia_to_dbpedia . drop literal class opl:lit_to_string . drop iri class opl:wwwsitefamily . drop iri class opl:wwwsiteformat . drop iri class opl:wwwsitecategory . drop iri class opl:wwwsiteproduct . ; DB.DBA.RDF_AUDIT_METADATA (1, '*'); SPARQL prefix opl: <http://www.openlinksw.com/schemas/oplweb#> create iri class opl:Component "http://data.openlinksw.com/oplweb/component/%s#this" (in component_name varchar not null) . create iri class opl:ComponentArchive "http://data.openlinksw.com/oplweb/component_archive/%s#this" (in component_archive_name varchar not null) . create iri class opl:ComponentArchiveType using function oplweb2.oplweb.COMPONENT_CATEGORY_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.COMPONENT_CATEGORY_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/component_archive_type/%s#this' ). create iri class opl:ComponentCategory using function oplweb2.oplweb.COMPONENT_CATEGORY_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.COMPONENT_CATEGORY_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/component_category/%s#this' ). create iri class opl:ComponentMode using function oplweb2.oplweb.COMPONENT_MODE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.COMPONENT_MODE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/component_mode/%s#this' ). create iri class opl:ComponentType using function oplweb2.oplweb.COMPONENT_TYPE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.COMPONENT_TYPE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/component_type/%s#this' ). create iri class opl:DbmsFamily using function oplweb2.oplweb.DBMS_FAMILY_URI (in _family_id integer not null) returns varchar, function oplweb2.oplweb.DBMS_FAMILY_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/dbms_family/%s#this' ). create iri class opl:DbmsEngine "http://data.openlinksw.com/oplweb/dbms_engine/%s#this" (in dbms_name varchar not null) . create iri class opl:DownloadLocation using function oplweb2.oplweb.DOWNLOAD_LOCATION_URI (in uri varchar not null) returns varchar, function oplweb2.oplweb.DOWNLOAD_LOCATION_URI_INVERSE (in dl_iri varchar) returns varchar option (bijection, returns 'http://data.openlinksw.com/oplweb/download_location/%s#this' ). create iri class opl:DownloadProtocol "http://data.openlinksw.com/oplweb/download_protocol/%s#this" (in protocol_name varchar not null) . create iri class opl:DownloadPartner "http://data.openlinksw.com/oplweb/download_partner/%s/%s#this" ( in host_name varchar not null, in domain_name varchar not null ) . create iri class opl:FeatureBenefit using function oplweb2.oplweb.FEATURE_BENEFIT_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.FEATURE_BENEFIT_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/feature_benefit/%s#this' ). create iri class opl:Opsys "http://data.openlinksw.com/oplweb/opsys/%s#this" (in opsys_name varchar not null) . create iri class opl:OpsysFamily using function oplweb2.oplweb.OPSYS_FAMILY_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.OPSYS_FAMILY_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/opsys_family/%s#this' ). create iri class opl:OpsysType using function oplweb2.oplweb.OPSYS_TYPE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.OPSYS_TYPE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/opsys_type/%s#this' ). create iri class opl:Processor "http://data.openlinksw.com/oplweb/processor/%s/%d#this" (in processor_name varchar not null, in processor_mode_id integer not null) . create iri class opl:ProcessorFamily using function oplweb2.oplweb.PROCESSOR_FAMILY_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PROCESSOR_FAMILY_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/processor_family/%s#this' ). create iri class opl:ProcessorMode using function oplweb2.oplweb.PROCESSOR_MODE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PROCESSOR_MODE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/processor_mode/%s#this' ). create iri class opl:Product "http://data.openlinksw.com/oplweb/product/%s#this" (in product_id varchar not null) . create iri class opl:ProductCategory "http://data.openlinksw.com/oplweb/product_category/%s#this" (in product_cat_code varchar not null) . create iri class opl:ProductCategoryFeature using function oplweb2.oplweb.PRODUCT_CATEGORY_FEATURE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PRODUCT_CATEGORY_FEATURE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/product_category_feature/%s#this' ). create iri class opl:ProductPortfolio "http://data.openlinksw.com/oplweb/portfolio/%s#this" (in x varchar not null) . create iri class opl:ProductFamily "http://data.openlinksw.com/oplweb/product_family/%s#this" (in product_family_code varchar not null) . create iri class opl:ProductFamilyFeature using function oplweb2.oplweb.PRODUCT_FAMILY_FEATURE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PRODUCT_FAMILY_FEATURE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/product_family_feature/%s#this' ). create iri class opl:ProductFeatureCategory using function oplweb2.oplweb.PRODUCT_FEATURE_CATEGORY_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PRODUCT_FEATURE_CATEGORY_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/product_feature_category/%s#this' ). create iri class opl:ProductFeature using function oplweb2.oplweb.PRODUCT_FEATURE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PRODUCT_FEATURE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/product_feature/%s#this' ). create iri class opl:ProductFormat "http://data.openlinksw.com/oplweb/product_format/%s#this" (in product_format_code varchar not null) . create iri class opl:ProductFormatCategory "http://data.openlinksw.com/oplweb/product_format_category/%s/%s#this" (in product_format_code varchar not null, in product_cat_code varchar not null) . create iri class opl:ProductFormatFeature using function oplweb2.oplweb.PRODUCT_FORMAT_FEATURE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PRODUCT_FORMAT_FEATURE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/product_format_feature/%s#this' ). create iri class opl:ProductReleaseFeature using function oplweb2.oplweb.PRODUCT_RELEASE_FEATURE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PRODUCT_RELEASE_FEATURE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/product_release_feature/%s#this' ). create iri class opl:ProductBenefit using function oplweb2.oplweb.PRODUCT_BENEFIT_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PRODUCT_BENEFIT_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/product_benefit/%s#this' ). create iri class opl:ProductBenefitCategory using function oplweb2.oplweb.PRODUCT_BENEFIT_CATEGORY_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.PRODUCT_BENEFIT_CATEGORY_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/product_benefit_category/%s#this' ). create iri class opl:ProductRelease "http://data.openlinksw.com/oplweb/product_release/%s/%s/%s/%s#this" ( in product_id varchar not null, in product_release_id varchar not null, in opsys_name varchar not null, in dbms_name varchar not null ) . create iri class opl:Vendor using function oplweb2.oplweb.VENDOR_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.VENDOR_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/vendor/%s#this' ). create iri class opl:VendorCategory using function oplweb2.oplweb.VENDOR_CATEGORY_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.VENDOR_CATEGORY_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/vendor_category/%s#this' ). create iri class opl:VendorCategoryFamily using function oplweb2.oplweb.VENDOR_CATEGORY_FAMILY_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.VENDOR_CATEGORY_FAMILY_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/vendor_category_family/%s#this' ). create iri class opl:PriceType "http://data.openlinksw.com/oplweb/price_type/%d#this" (in product_price_type_id integer not null) . create iri class opl:LicenseType using function oplweb2.oplweb.LICENSE_MODEL_TYPE_URI (in _id integer not null) returns varchar, function oplweb2.oplweb.LICENSE_MODEL_TYPE_URI_INVERSE (in _iri varchar) returns integer option (bijection, returns 'http://data.openlinksw.com/oplweb/license_type/%s#this' ). create iri class opl:PriceUnitType "http://data.openlinksw.com/oplweb/price_unit_type/%s_%s_%d_%d_%d_%s#this" ( in product_release_id varchar not null, in product_id varchar not null, in opsys_family_id integer not null, in dbms_family_id integer not null, in product_price_type_id integer not null, in product_price_unit_type_id varchar not null) . create iri class opl:PriceUnitIncrementalDiscount "http://data.openlinksw.com/oplweb/price_unit_discount/%s_%s_%d_%d_%d_%s#this" ( in product_release_id varchar not null, in product_id varchar not null, in opsys_family_id integer not null, in dbms_family_id integer not null, in product_price_type_id integer not null, in product_price_unit_type_id varchar not null) . create iri class opl:ProductPrice "http://data.openlinksw.com/oplweb/product_price/%d#this" (in product_price_id integer not null) . create iri class opl:LicenseModel "http://data.openlinksw.com/oplweb/license_model/%s_%s_%d_%d_%d#this" ( in product_release_id varchar not null, in product_id varchar not null, in opsys_family_id integer not null, in dbms_family_id integer not null, in product_price_type_id integer not null ) . create iri class opl:Discount "http://data.openlinksw.com/oplweb/discount/%s/%d/%s/%d/%d/%d#this" ( in product_release_id varchar not null, in opsys_type_id integer not null, in product_id varchar not null, in opsys_family_id integer not null, in dbms_family_id integer not null, in product_price_type_id integer not null ) . create iri class opl:wwwsitefamily "http://%s.openlinksw.com/" ( in product_family_code varchar not null ) . create iri class opl:wwwsitecategory "http://%s.openlinksw.com/%s/" ( in product_family_code varchar not null, in product_category_code varchar not null ) . create iri class opl:wwwsiteformat "http://%s.openlinksw.com/%s/%s/" ( in product_family_code varchar not null, in product_category_code varchar not null, in product_format_code varchar not null ) . create iri class opl:Uri "%s" ( in uri varchar not null ) . create literal class opl:lit_product_release_label using function oplweb2.oplweb.LIT_PRODUCT_RELEASE_LABEL( in _product_id varchar, in _id integer, in _opsys_name varchar, in _dbms_name varchar ) returns varchar . create literal class opl:lit_format_cat_label using function oplweb2.oplweb.LIT_FORMAT_CAT_LABEL( in _format integer, in _cat integer ) returns varchar . create iri class opl:lit_openlink_logo using function oplweb2.oplweb.LITRDF_openlink_logo( in _code varchar ) returns varchar . create iri class opl:lit_homepage using function oplweb2.oplweb.LITRDF_homepage( in _code varchar ) returns varchar . create iri class opl:lit_opsys_icon using function oplweb2.oplweb.LITRDF_opsys_icon( in _id integer ) returns varchar . create iri class opl:lit_to_shop using function oplweb2.oplweb.LITRDF_to_shop( in release_id varchar, in product_id varchar, in opsys varchar, in dbms varchar ) returns varchar . create literal class opl:lit_license_model_type using function oplweb2.oplweb.LITRDF_license_model_type ( in _product_price_type_id integer ) returns varchar . create literal class opl:lit_license_model_explain using function oplweb2.oplweb.LITRDF_license_model_explain ( in _product_price_type_id integer ) returns varchar . create literal class opl:lit_shop_sample using function oplweb2.oplweb.LITRDF_shop_sample ( in release_id varchar, in product_id varchar, in opsys varchar, in dbms varchar ) returns varchar . create iri class opl:lit_wikipedia_to_dbpedia using function oplweb2.oplweb.LITRDF_wikipedia_to_dbpedia ( in wikipedia_url varchar ) returns varchar . create literal class opl:lit_to_string using function oplweb2.oplweb.LITRDF_to_string ( in _s varchar ) returns varchar . create iri class opl:wwwsiteproduct using function oplweb2.oplweb.wwwsiteproduct_URI (in _id varchar not null) returns varchar, function oplweb2.oplweb.wwwsiteproduct_URI_INVERSE (in _iri varchar) returns varchar . make opl:ProductCategory subclass of opl:ProductFamily . make opl:Product subclass of opl:ProductCategory . make opl:Product subclass of opl:ProductFormat . make opl:ProductRelease subclass of opl:Product . make opl:Opsys subclass of opl:OpsysFamily . make opl:DbmsEngine subclass of opl:DbmsFamily . ; DB.DBA.RDF_AUDIT_METADATA (1, '*'); SPARQL prefix opl: <http://www.openlinksw.com/schemas/oplweb#> prefix dc: <http://purl.org/dc/terms#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix oplds: <http://www.openlinksw.com/dataspace/organization/openlink#> prefix owl: <http://www.w3.org/2002/07/owl#> prefix umbel: <http://umbel.org/umbel/sc/> prefix gr: <http://purl.org/goodrelations/v1#> alter quad storage virtrdf:DefaultQuadStorage FROM oplweb2.oplweb.component_archive as component_archive_tbl FROM oplweb2.oplweb.component_archive_type as component_archive_type_tbl FROM oplweb2.oplweb.component_category as component_category_tbl text literal component_category_long_description FROM oplweb2.oplweb.component_mode as component_mode_tbl FROM oplweb2.oplweb.component_type as component_type_tbl FROM oplweb2.oplweb.components_for_rdfs as components_tbl FROM oplweb2.oplweb.dbms_engine as dbms_engine_tbl FROM oplweb2.oplweb.dbms_family as dbms_family_tbl FROM oplweb2.oplweb.download_location as download_location_tbl FROM oplweb2.oplweb.download_protocol as download_protocol_tbl FROM oplweb2.oplweb.download_partner as download_partner_tbl FROM oplweb2.oplweb.opsys as opsys_tbl FROM oplweb2.oplweb.opsys_family as opsys_family_tbl FROM oplweb2.oplweb.opsys_type as opsys_type_tbl FROM oplweb2.oplweb.processor_family as processor_family_tbl FROM oplweb2.oplweb.processor_mode as processor_mode_tbl FROM oplweb2.oplweb.processors as processors_tbl FROM oplweb2.oplweb.product as product_tbl text literal long_description FROM oplweb2.oplweb.product_benefits as product_benefits_tbl text literal product_benefit_explanation FROM oplweb2.oplweb.product_benefits_category as product_benefits_category_tbl FROM oplweb2.oplweb.product_category as product_category_tbl FROM oplweb2.oplweb.product_category_features_with_code as product_category_features_tbl text literal long_description FROM oplweb2.oplweb.product_family as product_family_tbl FROM oplweb2.oplweb.product_family as product_family_tbl_2 FROM oplweb2.oplweb.product_family_features_with_code as product_family_features_tbl text literal long_description FROM oplweb2.oplweb.product_features as product_features_tbl text literal long_description FROM oplweb2.oplweb.product_feature_category as product_feature_category_tbl text literal description FROM oplweb2.oplweb.product_format_features_with_code as product_format_features_tbl text literal long_description FROM oplweb2.oplweb.product_release_features as product_release_features_tbl text literal long_description FROM oplweb2.oplweb.product_release_with_family as product_release_tbl FROM oplweb2.oplweb.vendor_category as vendor_category_tbl FROM oplweb2.oplweb.vendor_category_family as vendor_category_family_tbl FROM oplweb2.oplweb.vendors as vendors_tbl FROM oplweb2.oplweb.product_formats_categories as product_formats_categories FROM oplweb2.oplweb.product_with_code as product_with_code FROM oplweb2.oplweb.product_category_with_code as product_category_with_code FROM oplweb2.oplweb.product_format as product_format_with_code FROM oplweb2.oplweb.product_price as pp FROM oplweb2.oplweb.product_price_type as pt FROM oplweb2.DBA.license_model_unit_type as put FROM oplweb2.DBA.license_model_unit_type as put2 FROM oplweb2.DBA.license_model as lm FROM oplweb2.DBA.license_model as lm2 FROM oplweb2.DBA.license_model_type as license_model_type_tbl FROM oplweb2.DBA.product_price_varchar as ppv FROM oplweb2.DBA.product_general_discount_vc as gd FROM oplweb2.oplweb.archive_coverage_osdb as ac1 { create virtrdf:product_portfolio as graph <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> { opl:ProductPortfolio(product_family_tbl.product_family_code) a opl:ProductPortfolio as virtrdf:OplProductPortfolio . opl:ProductPortfolio(product_family_tbl.product_family_code) opl:hasProductFamilies opl:ProductFamily(product_family_tbl.product_family_code) as virtrdf:OplProductPortfolioProductFamily . opl:ProductFamily(product_family_tbl.product_family_code) a opl:ProductFamily as virtrdf:OplProductFamily ; rdfs:label product_family_tbl.product_family_description as virtrdf:rdfsOplProductFamilyDescription ; foaf:name product_family_tbl.product_family_description as virtrdf:nameOplProductFamilyDescription ; foaf:logo opl:lit_openlink_logo(product_family_tbl.product_family_code) as virtrdf:logoOpenLinkSoftware ; foaf:homepage opl:lit_homepage(product_family_tbl.product_family_code) as virtrdf:homepageProductFamily ; foaf:homepage opl:wwwsitefamily(product_family_tbl.product_family_code) # where ( # ^{product_family_tbl.}^.product_family_code = 'uda' # ) as virtrdf:homepageProductFamilyUda ; foaf:maker oplds:this as virtrdf:OplDataspaceOpenLinkUri ; owl:sameAs product_family_tbl.dbpedia_uri as virtrdf:OplFamilyOwlSameAsDBPediaUri ; opl:ProductFamilyCode product_family_tbl.product_family_code as virtrdf:OplProductFamilyCode ; opl:ProductFamilyDescription product_family_tbl.product_family_description as virtrdf:OplProductFamilyDescription ; dc:description opl:lit_to_string(product_family_tbl.long_description) as virtrdf:OplProductFamilyLongDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy foaf: ; rdfs:isDefinedBy dc: ; rdfs:isDefinedBy owl: ; rdfs:isDefinedBy rdfs: . opl:ProductCategory(product_category_with_code.product_cat_code) a opl:ProductCategory as virtrdf:OplProductCategory ; a opl:ProductFamily as virtrdf:OplProductCategorySubClassOfProductFamily ; rdfs:label product_category_with_code.product_category_description as virtrdf:rdfsOplProductCategoryDescription ; foaf:homepage opl:wwwsitecategory(product_category_with_code.product_family_code, product_category_with_code.product_cat_code) # where ( # ^{product_category_with_code.}^.product_family_code = 'uda' # ) as virtrdf:homepageProductFamilyCategoryUda ; opl:ProductCategoryCode product_category_with_code.product_cat_code as virtrdf:OplProductCategoryCode ; owl:sameAs product_category_with_code.dbpedia_uri as virtrdf:OplCategoryOwlSameAsDBPediaUri ; opl:hasFamily opl:ProductFamily(product_category_with_code.product_family_code) as virtrdf:OplProductCategoryIsOfFamily ; opl:ProductCategoryDescription product_category_with_code.product_category_description as virtrdf:OplProductCategoryDescription ; dc:description opl:lit_to_string(product_category_with_code.long_description) as virtrdf:OplProductCategoryLongDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: ; rdfs:isDefinedBy foaf: ; rdfs:isDefinedBy dc: ; rdfs:isDefinedBy owl: . opl:ProductFormat(product_format_with_code.product_format_code) a opl:ProductFormat as virtrdf:OplProductFormat ; opl:ProductFormatCode product_format_with_code.product_format_code as virtrdf:OplProductFormatCode ; rdfs:label product_format_with_code.product_format_description as virtrdf:rdfsOplProductFormatDescription ; dc:description product_format_with_code.product_format_description as virtrdf:OplProductFormatDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: ; rdfs:isDefinedBy dc: . opl:ProductFormatCategory(product_formats_categories.product_format_code, product_formats_categories.product_cat_code) a opl:ProductFormatCategory as virtrdf:OplProductFormatCategory ; a opl:ProductFormat as virtrdf:OplProductFormatCategoryProductFormat ; a opl:ProductCategory as virtrdf:OplProductFormatCategoryProductCategory ; foaf:homepage opl:wwwsiteformat(product_category_with_code.product_family_code, product_formats_categories.product_cat_code, product_formats_categories.product_format_code) where ( ^{product_category_with_code.}^.product_cat_code = ^{product_formats_categories.}^.product_cat_code # and # ^{product_category_with_code.}^.product_family_code = 'uda' ) as virtrdf:homepageProductFamilyCategoryFormatUda ; opl:ProductFormatCode product_formats_categories.product_format_code as virtrdf:OplProductFormatCategoryFormatCode ; opl:ProductCategoryCode product_formats_categories.product_cat_code as virtrdf:OplProductFormatCategoryCategoryCode ; opl:isProductCategory opl:ProductCategory(product_formats_categories.product_cat_code) as virtrdf:OplProductFormatCategoryisCategory ; opl:isProductFormat opl:ProductFormat(product_formats_categories.product_format_code) as virtrdf:OplProductFormatCategoryisFormat ; rdfs:label opl:lit_format_cat_label(product_formats_categories.product_format_id, product_formats_categories.product_cat_id) as virtrdf:rdfsOplProductFormatCategoryDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy foaf: ; rdfs:isDefinedBy rdfs: . opl:ProductCategory(product_category_with_code.product_cat_code) opl:hasProduct opl:Product(product_with_code.product_id) where (^{product_with_code.}^.product_cat_id = ^{product_category_with_code.}^.product_cat_id) as virtrdf:OplProductCategoryIsCategoryOfProduct . opl:ProductFormat(product_format_with_code.product_format_code) opl:hasProduct opl:Product(product_with_code.product_id) where (^{product_with_code.}^.product_format_id = ^{product_format_with_code.}^.product_format_id) as virtrdf:OplProductFormatIsFormatOfProduct . opl:ProductFamily(product_family_tbl.product_family_code) opl:hasCategory opl:ProductCategory(product_category_with_code.product_cat_code) where (^{product_family_tbl.}^.product_family_id = ^{product_category_with_code.}^.product_family_id) as virtrdf:OplProductFamilyIsFamilyOfProductCategory . opl:ProductFamily(product_family_tbl.product_family_code) opl:hasFormat opl:ProductFormat(product_formats_categories.product_format_code) where ( ^{product_family_tbl.}^.product_family_id = ^{product_formats_categories.}^.product_family_id ) as virtrdf:OplProductFamilyIsFamilyOfProductFormats . opl:ProductFamily(product_family_tbl.product_family_code) opl:otherProductFamilies opl:ProductFamily(product_family_tbl_2.product_family_code) where ( ^{product_family_tbl.}^.product_family_id <> ^{product_family_tbl_2.}^.product_family_id ) as virtrdf:OplProductFamilyHasOtherProductFamilies . opl:ProductFormat(product_format_with_code.product_format_code) opl:hasCategory opl:ProductFormatCategory(product_formats_categories.product_format_code, product_formats_categories.product_cat_code) where (^{product_formats_categories.}^.product_format_id = ^{product_format_with_code.}^.product_format_id) as virtrdf:OplProductFormatIsFormatOfProductFormatCategories . opl:ProductFormatCategory(product_formats_categories.product_format_code, product_formats_categories.product_cat_code) opl:hasProduct opl:Product(product_with_code.product_id) where ( ^{product_with_code.}^.product_cat_id = ^{product_formats_categories.}^.product_cat_id and ^{product_with_code.}^.product_format_id = ^{product_formats_categories.}^.product_format_id ) as virtrdf:OplProductFormatCategoryIsFormatCategoryOfProduct . opl:VendorCategoryFamily(vendor_category_family_tbl.vendor_category_family_id) a opl:VendorCategoryFamily as virtrdf:OplVendorCategoryFamily ; opl:VendorCategoryFamilyDescription vendor_category_family_tbl.vendor_category_family_desc as virtrdf:OplVendorCategoryFamilyDesc . opl:VendorCategory(vendor_category_tbl.vendor_category_id) a opl:VendorCategory as virtrdf:OplVendorCategory ; a opl:VendorCategoryFamily as virtrdf:OplVendorCategorySubClassOfVendorCategoryFamily ; rdfs:label vendor_category_tbl.vendor_category_description as virtrdf:rdfsOplVendorCategoryDescription ; opl:VendorCategoryDescription vendor_category_tbl.vendor_category_description as virtrdf:OplVendorCategoryDescription ; opl:isVendorCategoryOf opl:VendorCategoryFamily(vendor_category_tbl.vendor_category_family_id) as virtrdf:OplVendorCategoryIsOfCategoryFamily ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:Vendor(vendors_tbl.vendor_id) a opl:Vendor as virtrdf:OplVendor ; a opl:VendorCategory as virtrdf:OplVendorSubClassOfVendorCategory ; rdfs:label vendors_tbl.vendor_name as virtrdf:rdfsOplVendorsName ; opl:VendorName vendors_tbl.vendor_name as virtrdf:OplVendorsName ; opl:WikipediaPage opl:Uri(vendors_tbl.wikipedia_url) as virtrdf:OplVendorsWikipediaUrl ; owl:sameAs opl:lit_wikipedia_to_dbpedia(vendors_tbl.wikipedia_url) as virtrdf:OplVendorsWikipediaUrlOwlSameAs ; foaf:homepage opl:Uri(vendors_tbl.vendor_homepage) as virtrdf:OplFoafVendorHomepage ; opl:isOfVendorCategory opl:VendorCategory(vendors_tbl.vendor_category_id) as virtrdf:OplVendorIsOfVendorCategory ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: ; rdfs:isDefinedBy foaf: ; rdfs:isDefinedBy owl: . opl:VendorCategoryFamily(vendor_category_family_tbl.vendor_category_family_id) opl:hasVendorCategory opl:VendorCategory(vendor_category_tbl.vendor_category_id) where ( ^{vendor_category_family_tbl.}^.vendor_category_family_id = ^{vendor_category_tbl.}^.vendor_category_family_id ) as virtrdf:OplVendorCategoryFamilyHasVendorCategory . opl:VendorCategory(vendor_category_tbl.vendor_category_id) opl:hasVendorCategory opl:Vendor(vendors_tbl.vendor_id) where ( ^{vendor_category_tbl.}^.vendor_category_id = ^{vendors_tbl.}^.vendor_category_id ) as virtrdf:OplVendorCategoryHasVendors . opl:OpsysFamily(opsys_family_tbl.opsys_family_id) a opl:OpsysFamily as virtrdf:OplOpsysFamily ; rdfs:label opsys_family_tbl.opsys_family_name as virtrdf:rdfsOplOpsysFamilyName ; opl:OpsysFamilyName opsys_family_tbl.opsys_family_name as virtrdf:OplOpsysFamilyName ; opl:OpsysFamilyLicenseCode opsys_family_tbl.opsys_license_code as virtrdf:OplOpsysFamilyLicenseCode ; opl:OpsysFamilyVendor opl:Vendor(opsys_family_tbl.vendor_id) as virtrdf:OplOpsysFamilyVendor ; opl:OpsysFamilyRating opsys_family_tbl.rating as virtrdf:OplOpsysFamilyRating ; foaf:logo opl:lit_opsys_icon(opsys_family_tbl.opsys_family_id) as virtrdf:OplLogoOpsysFamily ; foaf:homepage opl:Uri(opsys_family_tbl.wikipedia_url) as virtrdf:FoafHomepageOpsysFamilyWikipediaUrl ; owl:sameAs opl:lit_wikipedia_to_dbpedia(opsys_family_tbl.wikipedia_url) as virtrdf:FoafHomepageOpsysFamilyPediaUrlOwlSameAs ; opl:WikipediaPage opl:Uri(opsys_family_tbl.wikipedia_url) as virtrdf:OplOpsysFamilyWikipediaUrl ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: ; rdfs:isDefinedBy foaf: ; rdfs:isDefinedBy owl: . opl:OpsysFamily(opsys_family_tbl.opsys_family_id) opl:hasOpsys opl:Opsys(opsys_tbl.opsys_name) where (^{opsys_tbl.}^.opsys_family_id = ^{opsys_family_tbl.}^.opsys_family_id) as virtrdf:OplOpsysFamilyIsOpsysFamilyOfOpsys . opl:DbmsFamily(dbms_family_tbl.dbms_family_id) a opl:DbmsFamily as virtrdf:OplDbmsFamily ; rdfs:label dbms_family_tbl.dbms_family_name as virtrdf:rdfsOplDbmsFamilyName ; opl:DbmsFamilyName dbms_family_tbl.dbms_family_name as virtrdf:OplDbmsFamilyName ; opl:DbmsFamilyVendor opl:Vendor(dbms_family_tbl.vendor_id) as virtrdf:OplDbmsFamilyVendor ; foaf:homepage opl:Uri(dbms_family_tbl.wikipedia_url) as virtrdf:FoafHomepageDbmsFamilyWikipediaUrl ; owl:sameAs opl:lit_wikipedia_to_dbpedia(dbms_family_tbl.wikipedia_url) as virtrdf:OwnSameAsDbmsFamilyPediaUrl ; opl:WikipediaPage opl:Uri(dbms_family_tbl.wikipedia_url) as virtrdf:OplDbmsFamilyWikipediaUrl ; opl:DbmsFamilyRating dbms_family_tbl.rating as virtrdf:OplDbmsFamilyRating ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: ; rdfs:isDefinedBy foaf: ; rdfs:isDefinedBy owl: . opl:DbmsEngine(dbms_engine_tbl.dbms_name) a opl:DbmsEngine as virtrdf:OplDbmsEngine ; a opl:DbmsFamily as virtrdf:DbmsEngineSubClassOfDbmsFamily ; a umbel:RelationalDatabaseServerProgram as virtrdf:DbmEngineSubClassOfUmbel ; opl:isOfDbmsFamily opl:DbmsFamily(dbms_engine_tbl.dbms_family_id) as virtrdf:OplDbmsEngineisOfDbmsFamily ; rdfs:label dbms_engine_tbl.dbms_name as virtrdf:rdfsOplLabelDbmsName ; opl:DbmsEngineVersion dbms_engine_tbl.dbms_version as virtrdf:OplDbmsEngineVersion ; opl:DbmsEngineUpwardCompatible dbms_engine_tbl.upward_compatible as virtrdf:OplDbmsEngineUpwardCompatible ; opl:DbmsEngineDownwardCompatible dbms_engine_tbl.downward_compatible as virtrdf:OplDbmsEngineDownwardCompatible ; opl:DbmsEngineRating dbms_engine_tbl.rating as virtrdf:OplDbmsEngineRating ; opl:DbmsEngineOldArchiveCode dbms_engine_tbl.old_archive_code as virtrdf:OplDbmsEngineOldArchiveCode ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:DbmsFamily(dbms_family_tbl.dbms_family_id) opl:hasDatabaseVersions opl:DbmsEngine(dbms_engine_tbl.dbms_name) where ( ^{dbms_family_tbl.}^.dbms_family_id = ^{dbms_engine_tbl.}^.dbms_family_id ) as virtrdf:OplDbmsFamilyToDbms . opl:OpsysType(opsys_type_tbl.opsys_type_id) a opl:OpsysType as virtrdf:OplOpsysType ; rdfs:label opsys_type_tbl.opsys_type_description as virtrdf:rdfsOplOpsysTypeDescription ; opl:OpsysTypeDescription opsys_type_tbl.opsys_type_description as virtrdf:OplOpsysTypeDescription ; opl:OpsysTypeShortDescription opsys_type_tbl.short_description as virtrdf:OplOpsysTypeShortDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:OpsysType(opsys_type_tbl.opsys_type_id) opl:hasOpsys opl:Opsys(opsys_tbl.opsys_name) where (^{opsys_tbl.}^.opsys_type_id = ^{opsys_type_tbl.}^.opsys_type_id) as virtrdf:OplOpsysTypeIsOpsysTypeOfOpsys . opl:ProcessorMode(processor_mode_tbl.processor_mode_id) a opl:ProcessorMode as virtrdf:OplProcessorMode ; opl:ProcessorModeName processor_mode_tbl.processor_mode_name as virtrdf:OplProcessorModeName . opl:Processor(processors_tbl.processor_name, processors_tbl.processor_mode_id) a opl:Processor as virtrdf:OplProcessor ; opl:ProcessorName processors_tbl.processor_name as virtrdf:OplProcessorName ; opl:ProcessorVersion processors_tbl.processor_version as virtrdf:OplProcessorVersion ; rdfs:label processors_tbl.processor_description as virtrdf:rdfsOplProcessorDescription ; opl:ProcessorDescription processors_tbl.processor_description as virtrdf:OplProcessorDescription ; opl:ProcessorMode opl:ProcessorMode(processors_tbl.processor_mode_id) as virtrdf:OplProcessorProcessorMode ; opl:isOfProcessorFamily opl:ProcessorFamily(processors_tbl.processor_family_id) as virtrdf:OplProcessorIsOfProcessorFamily ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:ProcessorFamily(processor_family_tbl.processor_family_id) a opl:ProcessorFamily as virtrdf:OplProcessorFamily ; opl:ProcessorFamilyName processor_family_tbl.processor_family_name as virtrdf:OplProcessorFamilyName ; opl:ProcessorFamilyVendor opl:Vendor(processor_family_tbl.vendor_id) as virtrdf:OplProcessorFamilyVendor ; foaf:homepage opl:Uri(processor_family_tbl.wikipedia_url) as virtrdf:FoafHomepageProcessorFamilyWikipediaUrl ; owl:sameAs opl:lit_wikipedia_to_dbpedia(processor_family_tbl.wikipedia_url) as virtrdf:OwlSameAsProcessorFamilyPediaUrl ; opl:WikipediaPage opl:Uri(processor_family_tbl.wikipedia_url) as virtrdf:OplProcessorFamilyWikipediaUrl ; rdfs:label processor_family_tbl.processor_family_description as virtrdf:rdfsOplProcessorFamilyDescription ; opl:ProcessorFamilyDescription processor_family_tbl.processor_family_description as virtrdf:OplProcessorFamilyDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy foaf: ; rdfs:isDefinedBy owl: ; rdfs:isDefinedBy rdfs: . opl:Opsys(opsys_tbl.opsys_name) a opl:Opsys as virtrdf:OplOpsys ; a opl:OpsysFamily as virtrdf:OpsysSubClassOfOplOpsysFamily ; a umbel:OperatingSystem as virtrdf:OpsysSubClassOfUmbelOpsys ; opl:OpsysVersion opsys_tbl.opsys_version as virtrdf:OplOpsysVersion ; opl:OpsysUpwardCompatible opsys_tbl.upward_compatible as virtrdf:OplOpsysUpwardCompatible ; opl:OpsysDownwardCompatible opsys_tbl.downward_compatible as virtrdf:OplOpsysDownwardCompatible ; opl:OpsysSupported opsys_tbl.supported as virtrdf:OplOpsysSupported ; opl:OpsysLicenseCode opsys_tbl.opsys_license_code as virtrdf:OplOpsysLicenseCode ; rdfs:label opsys_tbl.commercial_name as virtrdf:rdfsOplOpsysCommercialName ; opl:OpsysCommercialName opsys_tbl.commercial_name as virtrdf:OplOpsysCommercialName ; opl:OpsysEmulationMode opl:ProcessorMode(opsys_tbl.emulation_mode_id) as virtrdf:OplOpsysEmulationMode ; opl:OpsysProcessor opl:Processor(opsys_tbl.processor_name, opsys_tbl.processor_mode_id) as virtrdf:OplOpsysProcessor ; opl:isOfOpsysFamily opl:OpsysFamily(opsys_tbl.opsys_family_id) as virtrdf:OplOpsysIsOfOpsysFamily ; opl:isOfOpsysType opl:OpsysType(opsys_tbl.opsys_type_id) as virtrdf:OplOpsysIsOfOpsysType ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:Product(product_with_code.product_id) a opl:Product as virtrdf:OplProduct ; a opl:ProductFormat as virtrdf:ProductSubClassOfProductFormat ; a opl:ProductCategory as virtrdf:ProductSubClassOfProductCategory ; a opl:ProductFormatCategory as virtrdf:OplProductProductFormatCategory ; rdfs:label product_with_code.poduct_description as virtrdf:rdfsOplProductDescription ; foaf:homepage opl:wwwsiteproduct(product_with_code.product_id) as virtrdf:homepageProductFamilyCategoryFormatProductUda ; opl:ProductDescription product_with_code.poduct_description as virtrdf:OplProductDescription ; dc:description opl:lit_to_string(product_with_code.long_description) as virtrdf:OplProductLongDescription ; opl:isOfCategory opl:ProductCategory(product_with_code.product_cat_code) as virtrdf:OplProductIsOfCategory ; opl:isOfFormat opl:ProductFormat(product_with_code.product_format_code) as virtrdf:OplProductIsOfFormat ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy foaf: ; rdfs:isDefinedBy dc: ; rdfs:isDefinedBy rdfs: . opl:Product(product_with_code.product_id) opl:hasProductRelease opl:ProductRelease( product_release_tbl.product_id, product_release_tbl.product_release_id, product_release_tbl.opsys_name, product_release_tbl.dbms_name ) where (^{product_with_code.}^.product_id = ^{product_release_tbl.}^.product_id) as virtrdf:OplProductIsProductOfProductRelease . opl:ProductRelease( product_release_tbl.product_id, product_release_tbl.product_release_id, product_release_tbl.opsys_name, product_release_tbl.dbms_name ) a opl:ProductRelease as virtrdf:OplProductRelease ; a opl:Product as virtrdf:OplProductReleaseSubClassProduct ; a gr:ProductOrService as virtrdf:OplProductReleaseAgrProductOrService ; rdfs:label opl:lit_product_release_label( product_release_tbl.product_id, product_release_tbl.product_release_id, product_release_tbl.opsys_name, product_release_tbl.dbms_name ) as virtrdf:rdfsOplProductReleaseProductReleaseId ; opl:ProductReleaseProductReleaseId product_release_tbl.product_release_id as virtrdf:OplProductReleaseProductReleaseId ; opl:isOfProduct opl:Product(product_release_tbl.product_id) as virtrdf:OplProductReleaseIsOfProduct ; opl:isForOpsys opl:Opsys(product_release_tbl.opsys_name) as virtrdf:OplProductReleaseIsForOpsys ; opl:isForDbmsEngine opl:DbmsEngine(product_release_tbl.dbms_name) as virtrdf:OplProductReleaseIsForDbmsEngine ; opl:UpwardCompatible product_release_tbl.upward_compatible as virtrdf:OplProductReleaseUpwardCompatible ; opl:DownwardCompatible product_release_tbl.downward_compatible as virtrdf:OplProductReleaseDownwardCompatible ; opl:PurchaseInShop opl:lit_to_shop ( product_release_tbl.product_release_id, product_release_tbl.product_id, product_release_tbl.opsys_name, product_release_tbl.dbms_name ) as virtrdf:OplProductReleaseToShop ; gr:hasBusinessFunction gr:Sell as virtrdf:grbusinessfunctionsell; opl:Supported product_release_tbl.supported as virtrdf:OplProductReleaseSupported ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy gr: . opl:ProductRelease( product_release_tbl.product_id, product_release_tbl.product_release_id, product_release_tbl.opsys_name, product_release_tbl.dbms_name ) opl:hasComponentArchive opl:ComponentArchive(component_archive_tbl.component_archive_name) where ( ^{product_release_tbl.}^.product_id = ^{component_archive_tbl.}^.product_id and ^{product_release_tbl.}^.product_release_id = ^{component_archive_tbl.}^.product_release_id and ^{product_release_tbl.}^.opsys_name = ^{component_archive_tbl.}^.opsys_name and ^{product_release_tbl.}^.dbms_name = ^{component_archive_tbl.}^.dbms_name ) as virtrdf:OplProductReleaseIsProductReleaseOfComponentArchive . opl:Component(components_tbl.component_name) a opl:Component as virtrdf:OplComponent ; opl:isOfComponentCategory opl:ComponentCategory(components_tbl.component_category_id) as virtrdf:OplComponentIsOfComponentCategory ; opl:isOfComponentType opl:ComponentType(components_tbl.component_type_id) as virtrdf:OplComponentIsOfComponentType ; opl:isOfComponentMode opl:ComponentMode(components_tbl.component_mode_id) as virtrdf:OplComponentIsOfComponentMode ; opl:isForOpsys opl:Opsys(components_tbl.opsys_name) as virtrdf:OplComponentIsForOpsys ; opl:isForDbmsEngine opl:DbmsEngine(components_tbl.dbms_name) as virtrdf:OplComponentIsForDbmsEngine ; opl:ComponentCvsid components_tbl.component_cvsid as virtrdf:OplComponentComponentCvsId ; opl:ComponentBuildDate components_tbl.component_build_date as virtrdf:OplComponentComponentBuildDate ; opl:Notes components_tbl.notes as virtrdf:OplComponentNotes ; opl:BuildComments components_tbl.build_comments as virtrdf:OplComponentBuildComments ; opl:Filesize components_tbl.str_filesize as virtrdf:OplComponentFilesize ; rdfs:isDefinedBy opl: . opl:DbmsEngine (dbms_engine_tbl.dbms_name) opl:hasComponents opl:Component(components_tbl.component_name) where (^{components_tbl.}^.dbms_name = ^{dbms_engine_tbl.}^.dbms_name) as virtrdf:OplDbmsEngineForComponents . opl:Opsys (opsys_tbl.opsys_name) opl:hasComponents opl:Component(components_tbl.component_name) where (^{components_tbl.}^.opsys_name = ^{opsys_tbl.}^.opsys_name) as virtrdf:OplOpsysForComponents . opl:ComponentMode(component_mode_tbl.component_mode_id) a opl:ComponentMode as virtrdf:OplComponentMode ; rdfs:label component_mode_tbl.component_mode_description as virtrdf:rdfsOplComponentModeDescription ; opl:ComponentModeDescription component_mode_tbl.component_mode_description as virtrdf:OplComponentModeDescription ; opl:ComponentModeShortDescription component_mode_tbl.short_description as virtrdf:OplComponentModeShortDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:ComponentType(component_type_tbl.component_type_id) a opl:ComponentType as virtrdf:OplComponentType ; rdfs:label component_type_tbl.component_type_description as virtrdf:rdfsOplComponentTypeDescription ; opl:ComponentTypeDescription component_type_tbl.component_type_description as virtrdf:OplComponentTypeDescription ; opl:ComponentTypeShortDescription component_type_tbl.short_description as virtrdf:OplComponentTypeShortDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:ComponentCategory(component_category_tbl.component_category_id) a opl:ComponentCategory as virtrdf:OplComponentCategory ; rdfs:label component_category_tbl.component_category_description as virtrdf:rdfsOplComponentCategoryDescription ; opl:ComponentCategoryDescription component_category_tbl.component_category_description as virtrdf:OplComponentCategoryDescription ; opl:ComponentCategoryShortDescription component_category_tbl.short_description as virtrdf:OplComponentCategoryShortDescription ; dc:description opl:lit_to_string(component_category_tbl.component_category_long_description) as virtrdf:OplComponentCategoryLongDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:ComponentArchive(component_archive_tbl.component_archive_name) a opl:ComponentArchive as virtrdf:OplComponentArchive ; a opl:Component as virtrdf:ComponentArchiveSubClassOfComponent ; opl:ComponentArchiveName component_archive_tbl.component_archive_name as virtrdf:OplComponentArchiveComponentArchiveName ; rdfs:label component_archive_tbl.component_archive_name as virtrdf:rdfsComponentArchiveComponentArchiveName ; opl:ComponentArchiveType opl:ComponentArchiveType(component_archive_tbl.component_archive_type_id) as virtrdf:ComponentArchiveComponentArchiveType ; opl:isOfComponent opl:Component(component_archive_tbl.component_name) as virtrdf:OplComponentArchiveIsOfComponent ; opl:isOfProductRelease opl:ProductRelease( component_archive_tbl.product_id, component_archive_tbl.product_release_id, component_archive_tbl.opsys_name, component_archive_tbl.dbms_name ) as virtrdf:OplComponentArchiveIsOfProductRelease ; opl:AssemblyDate component_archive_tbl.assembly_date as virtrdf:OplComponentArchiveAssemblyDate ; opl:FileUri component_archive_tbl.file_uri as virtrdf:OplComponentArchiveFileUri ; opl:LicenseCode component_archive_tbl.license_code as virtrdf:OplComponentArchiveLicenseCode ; opl:ResFullPath component_archive_tbl.res_full_path as virtrdf:OplComponentArchiveResFullPath ; opl:ResName component_archive_tbl.res_name as virtrdf:OplComponentArchiveResName ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:ComponentArchiveType(component_archive_type_tbl.component_archive_type_id) a opl:ComponentArchiveType as virtrdf:OplComponentArchiveType ; opl:ComponentArchiveShortName component_archive_type_tbl.component_archive_short_name as virtrdf:OplComponentArchiveTypeComponentArchiveShortName ; rdfs:label component_archive_type_tbl.component_archive_type_name as virtrdf:rdfsOplComponentArchiveTypeComponentArchiveTypeName ; opl:ComponentArchiveTypeName component_archive_type_tbl.component_archive_type_name as virtrdf:OplComponentArchiveTypeComponentArchiveTypeName ; opl:Extension component_archive_type_tbl.extension as virtrdf:OplComponentArchiveTypeExtension ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:DownloadLocation(download_location_tbl.uri) a opl:DownloadLocation as virtrdf:OplDownloadLocation ; opl:isOfComponentArchive opl:ComponentArchive(download_location_tbl.component_archive_name) as virtrdf:OplDownloadLocationIsOfComponentArchive ; opl:hasDownloadProtocol opl:DownloadProtocol(download_location_tbl.protocol_name) as virtrdf:DownloadLocationHasProtocolName ; rdfs:label download_location_tbl.uri_old as virtrdf:rdfsOplDownloadLocationLabel ; opl:isOfProductRelease opl:ProductRelease( download_location_tbl.product_id, download_location_tbl.product_release_id, download_location_tbl.opsys_name, download_location_tbl.dbms_name ) as virtrdf:OplDownloadLocationIsOfProductRelease ; opl:Uri download_location_tbl.uri as virtrdf:OplDownloadLocationUri ; opl:UriOld download_location_tbl.uri_old as virtrdf:OplDownloadLocationUriOld ; opl:hasDownloadPartner opl:DownloadPartner( download_location_tbl.host_name, download_location_tbl.domain_name ) as virtrdf:OplDownloadLocationHasDownloadPartner ; opl:DomainName download_location_tbl.domain_name as virtrdf:OplDownloadLocationDomainName ; opl:HostName download_location_tbl.host_name as virtrdf:OplDownloadLocationHostName ; opl:ResName download_location_tbl.res_name as virtrdf:OplDownloadLocationResName ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:DownloadProtocol(download_protocol_tbl.protocol_name) a opl:DownloadProtocol as virtrdf:OplDownloadProtocolProtocolName ; opl:ProtocolDescription download_protocol_tbl.protocol_description as virtrdf:OplDownloadProtocolProtocolDescription . opl:DownloadPartner( download_partner_tbl.host_name, download_partner_tbl.domain_name ) a opl:DownloadPartner as virtrdf:OplDownloadPartner; rdfs:label download_partner_tbl.partner_name as virtrdf:rdfsOplDownloadPartnerPartnerNamelabel ; opl:DownloadPartner download_partner_tbl.partner_name as virtrdf:OplDownloadPartnerPartnerName ; opl:PortNumber download_partner_tbl.port_number as virtrdf:OplDownloadPartnerPortNumber ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:ComponentArchive(component_archive_tbl.component_archive_name) opl:hasDownloadLocation opl:DownloadLocation(download_location_tbl.uri) where ( ^{component_archive_tbl.}^.component_archive_name = ^{download_location_tbl.}^.component_archive_name ) as virtrdf:OplComponentArchiveIsComponentArchiveOfDownloadLocation . opl:DownloadLocation(download_location_tbl.uri) opl:isDownloadLocationOf opl:ComponentArchive(component_archive_tbl.component_archive_name) where ( ^{download_location_tbl.}^.component_archive_name = ^{component_archive_tbl.}^.component_archive_name ) as virtrdf:OplDownloadLocationIsDownloadLocationOfComponentArchive . # # Extra Peripheral family/cat/format/etc... to/from... dbfamily/opsysfamily/.... # ================================================================================== # ---------------------> product_family # opl:ProductFamily(product_family_tbl.product_family_code) # opl:OperatingSystems # opl:Opsys(ac1.opsys_name) # where ( # ^{product_family_tbl.}^.product_family_code = ^{ac1.}^.product_family_code # ) # as virtrdf:OplProductFamilyToOpsys . opl:ProductFamily(product_family_tbl.product_family_code) opl:OperatingSystemsFamilies opl:OpsysFamily(ac1.opsys_family_id) where ( ^{product_family_tbl.}^.product_family_code = ^{ac1.}^.product_family_code ) as virtrdf:OplProductFamilyToOpsysFamily . # opl:ProductFamily(product_family_tbl.product_family_code) # opl:Databases # opl:DbmsEngine(ac1.dbms_name) # where ( # ^{product_family_tbl.}^.product_family_code = ^{ac1.}^.product_family_code # ) # as virtrdf:OplProductFamilyToDbms . opl:ProductFamily(product_family_tbl.product_family_code) opl:DatabaseFamilies opl:DbmsFamily(ac1.dbms_family_id) where ( ^{product_family_tbl.}^.product_family_code = ^{ac1.}^.product_family_code ) as virtrdf:OplProductFamilyToDbmsFamily . # opl:ProductFamily(product_family_tbl.product_family_code) # opl:Processors # opl:Processor(ac1.processor_name, ac1.processor_mode_id) # where ( # ^{product_family_tbl.}^.product_family_code = ^{ac1.}^.product_family_code # ) # as virtrdf:OplProductFamilyToProcessor . opl:ProductFamily(product_family_tbl.product_family_code) opl:ProcessorFamilies opl:ProcessorFamily(ac1.processor_family_id) where ( ^{product_family_tbl.}^.product_family_code = ^{ac1.}^.product_family_code ) as virtrdf:OplProductFamilyToProcessorFamily . # ---------------------> product_format # opl:ProductFormat(product_format_with_code.product_format_code) # opl:OperatingSystems # opl:Opsys(ac1.opsys_name) # where ( # ^{product_format_with_code.}^.product_format_code = ^{ac1.}^.product_format_code # ) # as virtrdf:OplProductFormatToOpsys . opl:ProductFormat(product_format_with_code.product_format_code) opl:OperatingSystemsFamilies opl:OpsysFamily(ac1.opsys_family_id) where ( ^{product_format_with_code.}^.product_format_code = ^{ac1.}^.product_format_code ) as virtrdf:OplProductFormatToOpsysFamily . # opl:ProductFormat(product_format_with_code.product_format_code) # opl:Databases # opl:DbmsEngine(ac1.dbms_name) # where ( # ^{product_format_with_code.}^.product_format_code = ^{ac1.}^.product_format_code # ) # as virtrdf:OplProductFormatToDbms . opl:ProductFormat(product_format_with_code.product_format_code) opl:DatabaseFamilies opl:DbmsFamily(ac1.dbms_family_id) where ( ^{product_format_with_code.}^.product_format_code = ^{ac1.}^.product_format_code ) as virtrdf:OplProductFormatToDbmsFamily . opl:ProductFormat(product_format_with_code.product_format_code) opl:Processors opl:Processor(ac1.processor_name, ac1.processor_mode_id) where ( ^{product_format_with_code.}^.product_format_code = ^{ac1.}^.product_format_code ) as virtrdf:OplProductFormatToProcessor . opl:ProductFormat(product_format_with_code.product_format_code) opl:ProcessorFamilies opl:ProcessorFamily(ac1.processor_family_id) where ( ^{product_format_with_code.}^.product_format_code = ^{ac1.}^.product_format_code ) as virtrdf:OplProductFormatToProcessorFamily . # ---------------------> product_category # opl:ProductCategory(product_category_with_code.product_cat_code) # opl:OperatingSystems # opl:Opsys(ac1.opsys_name) # where ( # ^{product_category_with_code.}^.product_cat_code = ^{ac1.}^.product_cat_code # ) # as virtrdf:OplProductCatToOpsys . opl:ProductCategory(product_category_with_code.product_cat_code) opl:OperatingSystemsFamilies opl:OpsysFamily(ac1.opsys_family_id) where ( ^{product_category_with_code.}^.product_cat_code = ^{ac1.}^.product_cat_code ) as virtrdf:OplProductCatToOpsysFamily . # opl:ProductCategory(product_category_with_code.product_cat_code) # opl:Databases # opl:DbmsEngine(ac1.dbms_name) # where ( # ^{product_category_with_code.}^.product_cat_code = ^{ac1.}^.product_cat_code # ) # as virtrdf:OplProductCatToDbms . opl:ProductCategory(product_category_with_code.product_cat_code) opl:DatabaseFamilies opl:DbmsFamily(ac1.dbms_family_id) where ( ^{product_category_with_code.}^.product_cat_code = ^{ac1.}^.product_cat_code ) as virtrdf:OplProductCatToDbmsFamily . # opl:ProductCategory(product_category_with_code.product_cat_code) # opl:Processors # opl:Processor(ac1.processor_name, ac1.processor_mode_id) # where ( # ^{product_category_with_code.}^.product_cat_code = ^{ac1.}^.product_cat_code # ) # as virtrdf:OplProductCatToProcessor . opl:ProductCategory(product_category_with_code.product_cat_code) opl:ProcessorFamilies opl:ProcessorFamily(ac1.processor_family_id) where ( ^{product_category_with_code.}^.product_cat_code = ^{ac1.}^.product_cat_code ) as virtrdf:OplProductCatToProcessorFamily . # ---------------------> product opl:Product(product_with_code.product_id) opl:OperatingSystems opl:Opsys(ac1.opsys_name) where ( ^{product_with_code.}^.product_id = ^{ac1.}^.product_id ) as virtrdf:OplProductToOpsys . opl:Product(product_with_code.product_id) opl:OperatingSystemsFamilies opl:OpsysFamily(ac1.opsys_family_id) where ( ^{product_with_code.}^.product_id = ^{ac1.}^.product_id ) as virtrdf:OplProductToOpsysFamily . opl:Product(product_with_code.product_id) opl:Databases opl:DbmsEngine(ac1.dbms_name) where ( ^{product_with_code.}^.product_id = ^{ac1.}^.product_id ) as virtrdf:OplProductToDbms . opl:Product(product_with_code.product_id) opl:DatabaseFamilies opl:DbmsFamily(ac1.dbms_family_id) where ( ^{product_with_code.}^.product_id = ^{ac1.}^.product_id ) as virtrdf:OplProductToDbmsFamily . opl:Product(product_with_code.product_id) opl:Processors opl:Processor(ac1.processor_name, ac1.processor_mode_id) where ( ^{product_with_code.}^.product_id = ^{ac1.}^.product_id ) as virtrdf:OplProductToProcessor . opl:Product(product_with_code.product_id) opl:ProcessorFamilies opl:ProcessorFamily(ac1.processor_family_id) where ( ^{product_with_code.}^.product_id = ^{ac1.}^.product_id ) as virtrdf:OplProductToProcessorFamily . # ---------------------> to product opl:Opsys(opsys_tbl.opsys_name) opl:hasProducts opl:Product(ac1.product_id) where ( ^{opsys_tbl.}^.opsys_name = ^{ac1.}^.opsys_name ) as virtrdf:OplOpsysToProduct . opl:OpsysFamily(opsys_family_tbl.opsys_family_id) opl:hasProducts opl:Product(ac1.product_id) where ( ^{opsys_family_tbl.}^.opsys_family_id = ^{ac1.}^.opsys_family_id ) as virtrdf:OplOpsysFamilyToProduct . opl:DbmsEngine(dbms_engine_tbl.dbms_name) opl:hasProducts opl:Product(ac1.product_id) where ( ^{dbms_engine_tbl.}^.dbms_name = ^{ac1.}^.dbms_name ) as virtrdf:OplDbmsToProduct . opl:DbmsFamily(dbms_family_tbl.dbms_family_id) opl:hasProducts opl:Product(ac1.product_id) where ( ^{dbms_family_tbl.}^.dbms_family_id = ^{ac1.}^.dbms_family_id ) as virtrdf:OplDbmsFamilyToProduct . opl:Processor(processors_tbl.processor_name, processors_tbl.processor_mode_id) opl:hasProducts opl:Product(ac1.product_id) where ( ^{processors_tbl.}^.processor_name = ^{ac1.}^.processor_name and ^{processors_tbl.}^.processor_mode_id = ^{ac1.}^.processor_mode_id ) as virtrdf:OplProcessorToProduct . opl:ProcessorFamily(processor_family_tbl.processor_family_id) opl:hasProducts opl:Product(ac1.product_id) where ( ^{processor_family_tbl.}^.processor_family_id = ^{ac1.}^.processor_family_id ) as virtrdf:OplProcessorFamilyProduct . # ---------------------> to product_cat # opl:Opsys(opsys_tbl.opsys_name) # opl:hasProductCategory # opl:ProductCategory(ac1.product_cat_code) # where ( # ^{opsys_tbl.}^.opsys_name = ^{ac1.}^.opsys_name # ) # as virtrdf:OplOpsysToProductCategory . opl:OpsysFamily(opsys_family_tbl.opsys_family_id) opl:hasProductCategory opl:ProductCategory(ac1.product_cat_code) where ( ^{opsys_family_tbl.}^.opsys_family_id = ^{ac1.}^.opsys_family_id ) as virtrdf:OplOpsysFamilyToProductCategory . # opl:DbmsEngine(dbms_engine_tbl.dbms_name) # opl:hasProductCategory # opl:ProductCategory(ac1.product_cat_code) # where ( # ^{dbms_engine_tbl.}^.dbms_name = ^{ac1.}^.dbms_name # ) # as virtrdf:OplDbmsToProductCategory . opl:DbmsFamily(dbms_family_tbl.dbms_family_id) opl:hasProductCategory opl:ProductCategory(ac1.product_cat_code) where ( ^{dbms_family_tbl.}^.dbms_family_id = ^{ac1.}^.dbms_family_id ) as virtrdf:OplDbmsFamilyToProductCategory . # opl:Processor(processors_tbl.processor_name, processors_tbl.processor_mode_id) # opl:hasProductCategory # opl:ProductCategory(ac1.product_cat_code) # where ( # ^{processors_tbl.}^.processor_name = ^{ac1.}^.processor_name # and # ^{processors_tbl.}^.processor_mode_id = ^{ac1.}^.processor_mode_id # ) # as virtrdf:OplProcessorToProductCategory . opl:ProcessorFamily(processor_family_tbl.processor_family_id) opl:hasProductCategory opl:ProductCategory(ac1.product_cat_code) where ( ^{processor_family_tbl.}^.processor_family_id = ^{ac1.}^.processor_family_id ) as virtrdf:OplProcessorFamilyProductCategory . # ---------------------> to product_format # opl:Opsys(opsys_tbl.opsys_name) # opl:hasProductFormat # opl:ProductFormat(ac1.product_format_code) # where ( # ^{opsys_tbl.}^.opsys_name = ^{ac1.}^.opsys_name # ) # as virtrdf:OplOpsysToProductFormat . opl:OpsysFamily(opsys_family_tbl.opsys_family_id) opl:hasProductFormat opl:ProductFormat(ac1.product_format_code) where ( ^{opsys_family_tbl.}^.opsys_family_id = ^{ac1.}^.opsys_family_id ) as virtrdf:OplOpsysFamilyToProductFormat . # opl:DbmsEngine(dbms_engine_tbl.dbms_name) # opl:hasProductFormat # opl:ProductFormat(ac1.product_format_code) # where ( # ^{dbms_engine_tbl.}^.dbms_name = ^{ac1.}^.dbms_name # ) # as virtrdf:OplDbmsToProductFormat . opl:DbmsFamily(dbms_family_tbl.dbms_family_id) opl:hasProductFormat opl:ProductFormat(ac1.product_format_code) where ( ^{dbms_family_tbl.}^.dbms_family_id = ^{ac1.}^.dbms_family_id ) as virtrdf:OplDbmsFamilyToProductFormat . # opl:Processor(processors_tbl.processor_name, processors_tbl.processor_mode_id) # opl:hasProductFormat # opl:ProductFormat(ac1.product_format_code) # where ( # ^{processors_tbl.}^.processor_name = ^{ac1.}^.processor_name # and # ^{processors_tbl.}^.processor_mode_id = ^{ac1.}^.processor_mode_id # ) # as virtrdf:OplProcessorToProductFormat . opl:ProcessorFamily(processor_family_tbl.processor_family_id) opl:hasProductFormat opl:ProductFormat(ac1.product_format_code) where ( ^{processor_family_tbl.}^.processor_family_id = ^{ac1.}^.processor_family_id ) as virtrdf:OplProcessorFamilyProductFormat . # ---------------------> to product_family # opl:Opsys(opsys_tbl.opsys_name) # opl:hasProductFamily # opl:ProductFamily(ac1.product_family_code) # where ( # ^{opsys_tbl.}^.opsys_name = ^{ac1.}^.opsys_name # ) # as virtrdf:OplOpsysToProductFamily . opl:OpsysFamily(opsys_family_tbl.opsys_family_id) opl:hasProductFamily opl:ProductFamily(ac1.product_family_code) where ( ^{opsys_family_tbl.}^.opsys_family_id = ^{ac1.}^.opsys_family_id ) as virtrdf:OplOpsysFamilyToProductFamily . # opl:DbmsEngine(dbms_engine_tbl.dbms_name) # opl:hasProductFamily # opl:ProductFamily(ac1.product_family_code) # where ( # ^{dbms_engine_tbl.}^.dbms_name = ^{ac1.}^.dbms_name # ) # as virtrdf:OplDbmsToProductFamily . opl:DbmsFamily(dbms_family_tbl.dbms_family_id) opl:hasProductFamily opl:ProductFamily(ac1.product_family_code) where ( ^{dbms_family_tbl.}^.dbms_family_id = ^{ac1.}^.dbms_family_id ) as virtrdf:OplDbmsFamilyToProductFamily . # opl:Processor(processors_tbl.processor_name, processors_tbl.processor_mode_id) # opl:hasProductFamily # opl:ProductFamily(ac1.product_family_code) # where ( # ^{processors_tbl.}^.processor_name = ^{ac1.}^.processor_name # and # ^{processors_tbl.}^.processor_mode_id = ^{ac1.}^.processor_mode_id # ) # as virtrdf:OplProcessorToProductFamily . opl:ProcessorFamily(processor_family_tbl.processor_family_id) opl:hasProductFamily opl:ProductFamily(ac1.product_family_code) where ( ^{processor_family_tbl.}^.processor_family_id = ^{ac1.}^.processor_family_id ) as virtrdf:OplProcessorFamilyProductFamily . # # Product Benefits and things # ========================================= opl:ProductBenefit(product_benefits_tbl.product_benefit_id) a opl:ProductBenefit as virtrdf:OplProductBenefit ; rdfs:label product_benefits_tbl.product_benefit_desc as virtrdf:rdfsLabelProductBenefitDescription ; opl:isOfProductBenefitCategory opl:ProductBenefitCategory(product_benefits_tbl.product_benefit_category_id) as virtrdf:OplProductBenefitIsOfProductBenefitCategory ; opl:Description product_benefits_tbl.product_benefit_desc as virtrdf:OplProductBenefitDescription ; opl:Acronym product_benefits_tbl.product_benefit_acronym as virtrdf:OplProductBenefitAcronym ; opl:Explanation product_benefits_tbl.product_benefit_explanation as virtrdf:OplProductBenefitExplanation ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:ProductBenefitCategory(product_benefits_category_tbl.product_benefit_category_id) a opl:ProductBenefitCategory as virtrdf:OplProductBenefitCategory ; rdfs:label product_benefits_category_tbl.description as virtrdf:rdfsLabelProductBenefitCategoryDescription ; opl:Description product_benefits_category_tbl.description as virtrdf:OplProductBenefitCategoryDescription ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:ProductFeatureCategory(product_feature_category_tbl.product_feature_category_id) a opl:ProductFeatureCategory as virtrdf:OplProductFeatureCategory ; rdfs:label product_feature_category_tbl.short_desc as virtrdf:rdfsLabelProductFeatureCategoryShortDescription ; opl:ShortDescription product_feature_category_tbl.short_desc as virtrdf:OplProductFeatureCategoryShortDescription ; opl:Description product_feature_category_tbl.description as virtrdf:OplProductFeatureCategoryDescription ; opl:StandardsId product_feature_category_tbl.standards_id as virtrdf:OplProductFeatureCategoryStandardsId ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:ProductFeature(product_features_tbl.product_feature_id) a opl:ProductFeature as virtrdf:OplProductFeature ; rdfs:label product_features_tbl.short_description as virtrdf:rdfsLabelProductFeaturesShortDescription ; opl:Description product_features_tbl.short_description as virtrdf:OplProductFeaturesShortDescription ; dc:description opl:lit_to_string(product_features_tbl.long_description) as virtrdf:OplProductFeaturesLongDescription ; opl:isOfProductBenefit opl:ProductBenefit(product_features_tbl.product_feature_benefit_id) as virtrdf:ProductFeaturesIsOfProductBenefit ; opl:isOfProductFeatureCategory opl:ProductFeatureCategory(product_features_tbl.product_feature_category_id) as virtrdf:ProductFeaturesIsOfProductFeatureCategory ; opl:isOfProduct opl:Product(product_features_tbl.product_id) as virtrdf:ProductFeaturesIsOfProduct ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy dc: ; rdfs:isDefinedBy rdfs: . opl:Product(product_with_code.product_id) opl:hasFeature opl:ProductFeature(product_features_tbl.product_feature_id) where ( ^{product_with_code.}^.product_id = ^{product_features_tbl.}^.product_id ) as virtrdf:OplProductHasProductFeaturesProductFeatures . opl:ProductFeature(product_features_tbl.product_feature_id) opl:isFeatureOf opl:Product(product_with_code.product_id) where ( ^{product_with_code.}^.product_id = ^{product_features_tbl.}^.product_id ) as virtrdf:OplProductFeaturesAreProductFeaturesProduct . opl:ProductFamilyFeature(product_family_features_tbl.product_family_feature_id) a opl:ProductFamilyFeature as virtrdf:OplProductFamilyFeature ; rdfs:label product_family_features_tbl.short_description as virtrdf:rdfsLabelProductFamilyFeaturesShortDescription ; opl:Description product_family_features_tbl.short_description as virtrdf:OplProductFamilyFeaturesShortDescription ; dc:description opl:lit_to_string(product_family_features_tbl.long_description) as virtrdf:OplProductFamilyFeaturesLongDescription ; opl:isOfProductBenefit opl:ProductBenefit(product_family_features_tbl.product_family_feature_benefit_id) as virtrdf:ProductFamilyFeaturesIsOfProductBenefit ; opl:isOfProductFeatureCategory opl:ProductFeatureCategory(product_family_features_tbl.product_family_feature_cat_id) as virtrdf:ProductFamilyFeaturesIsOfProductFeatureCategory ; opl:isOfProductFamily opl:ProductFamily(product_family_features_tbl.product_family_code) as virtrdf:ProductFamilyFeaturesIsOfProductFamily ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy dc: ; rdfs:isDefinedBy rdfs: . opl:ProductFamily(product_family_tbl.product_family_code) opl:hasFeature opl:ProductFamilyFeature(product_family_features_tbl.product_family_feature_id) where ( ^{product_family_tbl.}^.product_family_id = ^{product_family_features_tbl.}^.product_family_id ) as virtrdf:OplProductFamilyHasProductFamilyFeaturesProductFamilyFeatures . opl:ProductFamilyFeature(product_family_features_tbl.product_family_feature_id) opl:isFeatureOf opl:Product(product_family_tbl.product_family_code) where ( ^{product_family_tbl.}^.product_family_id = ^{product_family_features_tbl.}^.product_family_id ) as virtrdf:OplProductFamilyFeaturesAreProductFamilyFeaturesProductFamily . opl:ProductFormatFeature(product_format_features_tbl.product_format_feature_id) a opl:ProductFormatFeature as virtrdf:OplProductFormatFeature ; rdfs:label product_format_features_tbl.short_description as virtrdf:rdfsLabelProductFormatFeaturesShortDescription ; opl:Description product_format_features_tbl.short_description as virtrdf:OplProductFormatFeaturesShortDescription ; dc:description opl:lit_to_string(product_format_features_tbl.long_description) as virtrdf:OplProductFormatFeaturesLongDescription ; opl:isOfProductBenefit opl:ProductBenefit(product_format_features_tbl.product_format_feature_benefit_id) as virtrdf:ProductFormatFeaturesIsOfProductBenefit ; opl:isOfProductFeatureCategory opl:ProductFeatureCategory(product_format_features_tbl.product_format_feature_cat_id) as virtrdf:ProductFormatFeaturesIsOfProductFeatureCategory ; opl:isOfProductFormat opl:ProductFormat(product_format_features_tbl.product_format_code) as virtrdf:ProductFormatFeaturesIsOfProductFormat ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy dc: ; rdfs:isDefinedBy rdfs: . opl:ProductFormat(product_format_with_code.product_format_code) opl:hasFeature opl:ProductFormatFeature(product_format_features_tbl.product_format_feature_id) where ( ^{product_format_with_code.}^.product_format_id = ^{product_format_features_tbl.}^.product_format_id ) as virtrdf:OplProductFormatHasProductFormatFeaturesProductFormatFeatures . opl:ProductFormatFeature(product_format_features_tbl.product_format_feature_id) opl:isFeatureOf opl:ProductFormat(product_format_with_code.product_format_code) where ( ^{product_format_with_code.}^.product_format_id = ^{product_format_features_tbl.}^.product_format_id ) as virtrdf:OplProductFormatFeaturesAreProductFormatFeaturesProductFormat . opl:ProductCategoryFeature(product_category_features_tbl.product_category_feature_id) a opl:ProductCategoryFeature as virtrdf:OplProductCategoryFeature ; rdfs:label product_category_features_tbl.short_description as virtrdf:rdfsLabelProductCategoryFeaturesShortDescription ; opl:Description product_category_features_tbl.short_description as virtrdf:OplProductCategoryFeaturesShortDescription ; dc:description opl:lit_to_string(product_category_features_tbl.long_description) as virtrdf:OplProductCategoryFeaturesLongDescription ; opl:isOfProductBenefit opl:ProductBenefit(product_category_features_tbl.product_category_feature_benefit_id) as virtrdf:ProductCategoryFeaturesIsOfProductBenefit ; opl:isOfProductFeatureCategory opl:ProductFeatureCategory(product_category_features_tbl.product_category_feature_category_id) as virtrdf:ProductCategoryFeaturesIsOfProductFeatureCategory ; opl:isOfProductCategory opl:ProductCategory(product_category_features_tbl.product_cat_code) as virtrdf:ProductCategoryFeaturesIsOfProductCategory ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy dc: ; rdfs:isDefinedBy rdfs: . opl:ProductCategory(product_category_with_code.product_cat_code) opl:hasFeature opl:ProductCategoryFeature(product_category_features_tbl.product_category_feature_id) where ( ^{product_category_with_code.}^.product_cat_id = ^{product_category_features_tbl.}^.product_cat_id ) as virtrdf:OplProductCategoryHasProductCategoryFeaturesProductCategoryFeatures . opl:ProductCategoryFeature(product_category_features_tbl.product_category_feature_id) opl:isFeatureOf opl:ProductCategory(product_category_with_code.product_cat_code) where ( ^{product_category_with_code.}^.product_cat_id = ^{product_category_features_tbl.}^.product_cat_id ) as virtrdf:OplProductCategoryFeaturesAreProductCategoryFeaturesProductCategory . opl:ProductReleaseFeature(product_release_features_tbl.product_release_feature_id) a opl:ProductReleaseFeature as virtrdf:OplProductReleaseFeature ; rdfs:label product_release_features_tbl.short_description as virtrdf:rdfsLabelProductReleaseFeaturesShortDescription ; opl:Description product_release_features_tbl.short_description as virtrdf:OplProductReleaseFeaturesShortDescription ; dc:description opl:lit_to_string(product_release_features_tbl.long_description) as virtrdf:OplProductReleaseFeaturesLongDescription ; opl:isOfProductBenefit opl:ProductBenefit(product_release_features_tbl.product_release_feature_benefit_id) as virtrdf:ProductReleaseFeaturesIsOfProductBenefit ; opl:isOfProductFeatureCategory opl:ProductFeatureCategory(product_release_features_tbl.product_release_feature_cat_id) as virtrdf:ProductReleaseFeaturesIsOfProductFeatureCategory ; opl:isOfProduct opl:Product(product_release_features_tbl.product_id) as virtrdf:ProductReleaseFeaturesIsOfProduct ; opl:ProductReleaseId product_release_features_tbl.product_release_id as virtrdf:ProductReleaseFeaturesProductRelease ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy dc: ; rdfs:isDefinedBy rdfs: . } . } . ; DB.DBA.RDF_AUDIT_METADATA (1, '*'); SPARQL prefix opl: <http://www.openlinksw.com/schemas/oplweb#> prefix dc: <http://purl.org/dc/terms#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix oplds: <http://www.openlinksw.com/dataspace/organization/openlink#> prefix owl: <http://www.w3.org/2002/07/owl#> prefix umbel: <http://umbel.org/umbel/sc/> prefix gr: <http://purl.org/goodrelations/v1#> alter quad storage virtrdf:DefaultQuadStorage FROM oplweb2.oplweb.component_archive as component_archive_tbl FROM oplweb2.oplweb.component_archive_type as component_archive_type_tbl FROM oplweb2.oplweb.component_category as component_category_tbl text literal component_category_long_description FROM oplweb2.oplweb.component_mode as component_mode_tbl FROM oplweb2.oplweb.component_type as component_type_tbl FROM oplweb2.oplweb.components_for_rdfs as components_tbl FROM oplweb2.oplweb.dbms_engine as dbms_engine_tbl FROM oplweb2.oplweb.dbms_family as dbms_family_tbl FROM oplweb2.oplweb.download_location as download_location_tbl FROM oplweb2.oplweb.download_protocol as download_protocol_tbl FROM oplweb2.oplweb.download_partner as download_partner_tbl FROM oplweb2.oplweb.opsys as opsys_tbl FROM oplweb2.oplweb.opsys_family as opsys_family_tbl FROM oplweb2.oplweb.opsys_type as opsys_type_tbl FROM oplweb2.oplweb.processor_family as processor_family_tbl FROM oplweb2.oplweb.processor_mode as processor_mode_tbl FROM oplweb2.oplweb.processors as processors_tbl FROM oplweb2.oplweb.product as product_tbl text literal long_description FROM oplweb2.oplweb.product_benefits as product_benefits_tbl text literal product_benefit_explanation FROM oplweb2.oplweb.product_benefits_category as product_benefits_category_tbl FROM oplweb2.oplweb.product_category as product_category_tbl FROM oplweb2.oplweb.product_category_features_with_code as product_category_features_tbl text literal long_description FROM oplweb2.oplweb.product_family as product_family_tbl FROM oplweb2.oplweb.product_family as product_family_tbl_2 FROM oplweb2.oplweb.product_family_features_with_code as product_family_features_tbl text literal long_description FROM oplweb2.oplweb.product_features as product_features_tbl text literal long_description FROM oplweb2.oplweb.product_feature_category as product_feature_category_tbl text literal description FROM oplweb2.oplweb.product_format_features_with_code as product_format_features_tbl text literal long_description FROM oplweb2.oplweb.product_release_features as product_release_features_tbl text literal long_description FROM oplweb2.oplweb.product_release_with_family as product_release_tbl FROM oplweb2.oplweb.vendor_category as vendor_category_tbl FROM oplweb2.oplweb.vendor_category_family as vendor_category_family_tbl FROM oplweb2.oplweb.vendors as vendors_tbl FROM oplweb2.oplweb.product_formats_categories as product_formats_categories FROM oplweb2.oplweb.product_with_code as product_with_code FROM oplweb2.oplweb.product_category_with_code as product_category_with_code FROM oplweb2.oplweb.product_format as product_format_with_code FROM oplweb2.oplweb.product_price as pp FROM oplweb2.oplweb.product_price_type as pt FROM oplweb2.DBA.license_model_unit_type as put FROM oplweb2.DBA.license_model_unit_type as put2 FROM oplweb2.DBA.license_model as lm FROM oplweb2.DBA.license_model as lm2 FROM oplweb2.DBA.license_model_type as license_model_type_tbl FROM oplweb2.DBA.product_price_varchar as ppv FROM oplweb2.DBA.product_general_discount_vc as gd FROM oplweb2.oplweb.archive_coverage_osdb as ac1 { create virtrdf:product_portfolio2 as graph <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> option (exclusive) { opl:ProcessorFamily(processor_family_tbl.processor_family_id) opl:hasProcessors opl:Processor(processors_tbl.processor_name, processors_tbl.processor_mode_id) where ( ^{processor_family_tbl.}^.processor_family_id = ^{processors_tbl.}^.processor_family_id ) as virtrdf:OplProcessorFamilyHasProcessors . opl:Processor(processors_tbl.processor_name, processors_tbl.processor_mode_id) opl:hasProductFamily opl:ProductFamily(ac1.product_family_code) where ( ^{processors_tbl.}^.processor_name = ^{ac1.}^.processor_name and ^{processors_tbl.}^.processor_mode_id = ^{ac1.}^.processor_mode_id ) as virtrdf:OplProcessorToProductFamily . # # Product Licensing and Shop stuff # ========================================= opl:ProductRelease( product_release_tbl.product_id, product_release_tbl.product_release_id, product_release_tbl.opsys_name, product_release_tbl.dbms_name ) opl:hasLicenseModel opl:LicenseModel( lm.product_release_id, lm.product_id, lm.opsys_family_id, lm.dbms_family_id, lm.product_price_type_id ) where ( ^{lm.}^.product_id = ^{product_release_tbl.}^.product_id and ^{lm.}^.product_release_id = ^{product_release_tbl.}^.product_release_id and ^{lm.}^.opsys_family_id = ^{product_release_tbl.}^.opsys_family_id and ^{lm.}^.dbms_family_id = ^{product_release_tbl.}^.dbms_family_id ) as virtrdf:OplProductReleaseHasLicenseModel . opl:ProductRelease( product_release_tbl.product_id, product_release_tbl.product_release_id, product_release_tbl.opsys_name, product_release_tbl.dbms_name ) opl:hasPriceSample opl:lit_shop_sample ( product_release_tbl.product_release_id, product_release_tbl.product_id, product_release_tbl.opsys_name, product_release_tbl.dbms_name ) as virtrdf:OplPriceSamples . opl:LicenseModel( lm.product_release_id, lm.product_id, lm.opsys_family_id, lm.dbms_family_id, lm.product_price_type_id) a opl:LicenseModel as virtrdf:OplLicenseModel; a gr:Sell as virtrdf:OplLicenseModelAgrSell ; a gr:ActualProductOrServiceInstance as virtrdf:OplLicenseModelAgrProductOrServiceInstance ; rdfs:label opl:lit_license_model_type( lm.product_price_type_id ) as virtrdf:OplLabelLicenseModel ; rdfs:description opl:lit_license_model_explain ( lm.product_price_type_id ) as virtrdf:OplLicenseModelExplain ; opl:ProductReleaseId lm.product_release_id as virtrdf:lm_shop_price_product_release; opl:isOfFormat opl:ProductFormat(lm.product_format_code) as virtrdf:lm_shop_price_product_format; opl:isOfCategory opl:ProductCategory(lm.product_cat_code) as virtrdf:lm_shop_price_product_cat; opl:OpsysFamily opl:OpsysFamily(lm.opsys_family_id) as virtrdf:lm_shop_price_opsys_family_oplweb; opl:OpsysType opl:OpsysType(lm.opsys_type_id) as virtrdf:lm_shop_price_opsys_type; opl:DbmsFamily opl:DbmsFamily(lm.dbms_family_id) as virtrdf:lm_shop_price_dbms_family ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: ; rdfs:isDefinedBy gr: . opl:LicenseModel( lm.product_release_id, lm.product_id, lm.opsys_family_id, lm.dbms_family_id, lm.product_price_type_id) opl:hasPriceUnitType opl:PriceUnitType( lm2.product_release_id, lm2.product_id, lm2.opsys_family_id, lm2.dbms_family_id, lm2.product_price_type_id, lm2.product_price_unit_type_id) where ( ^{lm.}^.product_release_id = ^{lm2.}^.product_release_id AND ^{lm.}^.product_id = ^{lm2.}^.product_id AND ^{lm.}^.opsys_family_id = ^{lm2.}^.opsys_family_id AND ^{lm.}^.opsys_type_id = ^{lm2.}^.opsys_type_id AND ^{lm.}^.product_price_type_id = ^{lm2.}^.product_price_type_id AND ^{lm2.}^.product_price_unit_type_id <> 'db_sessions' and ( ^{lm.}^.dbms_family_id = ^{lm2.}^.dbms_family_id OR ^{lm2.}^.dbms_family_id = 15 ) ) as virtrdf:OplLicenseModelPriceUnitTypes . opl:LicenseModel( lm.product_release_id, lm.product_id, lm.opsys_family_id, lm.dbms_family_id, lm.product_price_type_id) gr:hasPriceSpecification opl:PriceUnitType( lm2.product_release_id, lm2.product_id, lm2.opsys_family_id, lm2.dbms_family_id, lm2.product_price_type_id, lm2.product_price_unit_type_id) where ( ^{lm.}^.product_release_id = ^{lm2.}^.product_release_id AND ^{lm.}^.product_id = ^{lm2.}^.product_id AND ^{lm.}^.opsys_family_id = ^{lm2.}^.opsys_family_id AND ^{lm.}^.opsys_type_id = ^{lm2.}^.opsys_type_id AND ^{lm.}^.product_price_type_id = ^{lm2.}^.product_price_type_id AND ^{lm2.}^.product_price_unit_type_id = 'db_sessions' and ( ^{lm.}^.dbms_family_id = ^{lm2.}^.dbms_family_id OR ^{lm2.}^.dbms_family_id = 15 ) ) as virtrdf:OplLicenseModelBasePriceUnitTypes . opl:Discount( gd.product_release_id, gd.opsys_type_id, gd.product_id, gd.opsys_family_id, gd.dbms_family_id, gd.product_price_type_id) a opl:Discount as virtrdf:product_discount; rdfs:label gd.product_discount_description as virtrdf:OplLabelDiscount ; rdfs:description gd.product_discount_description as virtrdf:OplDiscountExplain ; opl:discount_description gd.product_discount_description as virtrdf:gd_discount_description; opl:discount_start gd.discount_start as virtrdf:gd_discount_start; opl:discount_end gd.discount_end as virtrdf:gd_discount_end; opl:ProductPriceType opl:PriceType(gd.product_price_type_id) as virtrdf:gd_shop_price_type; gr:hasUnitOfMeasurement opl:PriceType(gd.product_price_type_id) as virtrdf:gd_shop_price_type_grUnitOfMeasurement; opl:ProductReleaseId gd.product_release_id as virtrdf:gd_shop_price_product_release; opl:ProductFormat opl:ProductFormat(gd.product_format_code) as virtrdf:gd_shop_price_product_format; opl:ProductCategory opl:ProductCategory(gd.product_cat_code) as virtrdf:gd_shop_price_product_cat; opl:OpsysFamily opl:OpsysFamily(gd.opsys_family_id) as virtrdf:gd_shop_price_opsys_family_oplweb; opl:OpsysType opl:OpsysType(gd.opsys_type_id) as virtrdf:gd_shop_price_opsys_type; opl:DbmsFamily opl:DbmsFamily(gd.dbms_family_id) as virtrdf:gd_shop_price_dbms_family; opl:discount_token gd.discount_token as virtrdf:gd_discount_token ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:PriceType(pt.product_price_type_id) a opl:PriceType as virtrdf:shop_product_price_type; rdfs:label pt.product_price_type_description as virtrdf:OplLabelPriceType ; rdfs:description pt.product_price_type_description as virtrdf:OplPriceTypeExplain ; opl:PriceTypeDescription pt.product_price_type_description as virtrdf:shop_product_price_type_description; dc:description pt.product_price_type_long_description as virtrdf:shop_product_price_type_long_description ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy dc: ; rdfs:isDefinedBy rdfs: . opl:PriceUnitType( put.product_release_id, put.product_id, put.opsys_family_id, put.dbms_family_id, put.product_price_type_id, put.product_price_unit_type_id) a opl:PriceUnitType as virtrdf:shop_product_price_unit_type; rdfs:label put.product_price_unit_description as virtrdf:OplLabelproductpriceunitdescription ; rdfs:description put.product_price_unit_description as virtrdf:OplproductpriceunitdescriptionExplain ; gr:hasUnitOfMeasurement opl:PriceType(put.product_price_type_id) as virtrdf:put_shop_price_type_grUnitOfMeasurement; opl:unitValue put.unit_price as virtrdf:unit_type_unit_price; gr:hasValue put.unit_price as virtrdf:unit_type_unit_price_grHasValue; opl:graceUnits put.unit_grace as virtrdf:unit_type_unit_grace; opl:minUnits put.unit_low as virtrdf:unit_type_unit_low; opl:maxUnits put.unit_cap as virtrdf:unit_type_unit_cap; opl:unit_type_description put.product_price_unit_description as virtrdf:unit_type_description ; rdfs:isDefinedBy opl: ; rdfs:isDefinedBy rdfs: . opl:PriceUnitType( put.product_release_id, put.product_id, put.opsys_family_id, put.dbms_family_id, put.product_price_type_id, put.product_price_unit_type_id ) opl:hasIncrementalDiscount opl:PriceUnitIncrementalDiscount( put2.product_release_id, put2.product_id, put2.opsys_family_id, put2.dbms_family_id, put2.product_price_type_id, put2.product_price_unit_type_id ) where ( ^{put.}^.product_release_id = ^{put2.}^.product_release_id and ^{put.}^.product_id = ^{put2.}^.product_id and ^{put.}^.opsys_family_id = ^{put2.}^.opsys_family_id and ^{put.}^.dbms_family_id = ^{put2.}^.dbms_family_id and ^{put.}^.product_price_type_id = ^{put2.}^.product_price_type_id and ^{put.}^.product_price_unit_type_id = ^{put2.}^.product_price_unit_type_id ) as virtrdf:OplLicenseModelUnitsIncrementalDiscounts . opl:PriceUnitIncrementalDiscount( put.product_release_id, put.product_id, put.opsys_family_id, put.dbms_family_id, put.product_price_type_id, put.product_price_unit_type_id) a opl:PriceUnitIncrementalDiscount as virtrdf:shop_product_price_unit_type_incremental_discount; rdfs:label put.product_price_unit_description as virtrdf:OplLabelproductpriceunitIncDisdescription ; rdfs:description put.product_price_unit_description as virtrdf:OplproductpriceunitIncDisdescriptionExplain ; opl:percentageOfBase put.unit_discount as virtrdf:unit_type_unit_discount; opl:triggerPoint put.quantity as virtrdf:unit_type_unit_discount_quantity . opl:LicenseModel( lm.product_release_id, lm.product_id, lm.opsys_family_id, lm.dbms_family_id, lm.product_price_type_id ) opl:hasGeneralDiscounts opl:Discount( gd.product_release_id, gd.opsys_type_id, gd.product_id, gd.opsys_family_id, gd.dbms_family_id, gd.product_price_type_id ) where ( ^{lm.}^.product_release_id = ^{gd.}^.product_release_id AND ^{lm.}^.product_id = ^{gd.}^.product_id AND ^{lm.}^.opsys_family_id = ^{gd.}^.opsys_family_id AND ^{lm.}^.dbms_family_id = ^{gd.}^.dbms_family_id AND ^{lm.}^.opsys_type_id = ^{gd.}^.opsys_type_id AND ^{lm.}^.product_price_type_id = ^{gd.}^.product_price_type_id ) as virtrdf:OplLicenseModelGeneralDiscounts . } . } . ; DB.DBA.XML_SET_NS_DECL ('OpenLink', 'http://www.openlinksw.com/schemas/oplweb#', 2); DB.DBA.XML_SET_NS_DECL ('OplProductCategory', 'http://data.openlinksw.com/oplweb/product_category/', 2); DB.DBA.XML_SET_NS_DECL ('OplProductFamily', 'http://data.openlinksw.com/oplweb/product_family/', 2); DB.DBA.XML_SET_NS_DECL ('OplProductFormat', 'http://data.openlinksw.com/oplweb/product_format/', 2); DB.DBA.XML_SET_NS_DECL ('OplProduct', 'http://data.openlinksw.com/oplweb/product/', 2); DB.DBA.XML_SET_NS_DECL ('OplProductRelease', 'http://data.openlinksw.com/oplweb/product_release/', 2); DB.DBA.RDF_AUDIT_METADATA (1, '*'); commit work; -- Clear the 'cache' for immediate effects SELECT hs_local_iri, exec ('SPARQL clear graph <'||hs_local_iri||'>') FROM sys_http_sponge WHERE hs_local_iri like '%oplweb%'; SELECT id_to_iri(G), exec ('SPARQL clear graph <'||id_to_iri(G)||'>') FROM rdf_quad WHERE id_to_iri(G) like '%oplweb%'; SPARQL CLEAR GRAPH <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/>; commit work; SPARQL CONSTRUCT { <http://data.openlinksw.com/oplweb/product_family/uda#this> ?p ?o } FROM <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> WHERE { <http://data.openlinksw.com/oplweb/product_family/uda#this> ?p ?o } ; SPARQL SELECT * FROM <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> WHERE { <http://data.openlinksw.com/oplweb/product_category/odbc#this> ?p ?o } limit 100 ; SPARQL define get:soft "soft" SELECT * FROM <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> WHERE { <http://data.openlinksw.com/oplweb/product_category/odbc#this> ?p ?o } limit 100 ; SPARQL CONSTRUCT { <http://data.openlinksw.com/oplweb/product_category/jdbc#this> ?p ?o } FROM <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> WHERE { <http://data.openlinksw.com/oplweb/product_category/jdbc#this> ?p ?o } limit 100 ; SPARQL CONSTRUCT { <http://data.openlinksw.com/oplweb/product_format/mt#this> ?p ?o } FROM <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> WHERE { <http://data.openlinksw.com/oplweb/product_format/mt#this> ?p ?o } limit 1 ; SPARQL SELECT ?p ?o FROM <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> WHERE { <http://data.openlinksw.com/oplweb/product_family/uda#this> ?p ?o } limit 1 ; SPARQL prefix opl: <http://www.openlinksw.com/schemas/oplweb#> SELECT ?s ?o FROM <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> WHERE { ?s opl:hasProcessors ?o } limit 1 ; SPARQL prefix opl: <http://www.openlinksw.com/schemas/oplweb#> SELECT distinct ?o FROM <http://www.openlinksw.com/dataspace/organization/openlink/oplweb/> WHERE { <http://data.openlinksw.com/oplweb/processor/i686_1#this> opl:hasProductFamily ?o } limit 10 ; -- curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/price_unit_type/6.1_odbc-sqlserver-st_1_2_1_db_sessions#this" -- curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/price_unit_type/6.1_odbc-sqlserver-st_1_2_1_cpu#this" --SELECT top 10 * FROM oplweb2.DBA.license_model_unit_type WHERE product_release_id = '6.1' and product_id = 'odbc-sqlserver-st' -- and opsys_family_id = 1 and dbms_family_id = 15 and product_price_type_id = 1 and product_price_unit_type_id = 'cpu'; -- curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/rdfbrowser/index.html?uri=http%3A//data.openlinksw.com/oplweb/component_archive/6.1-odbc-oracle-st-i686-generic-win-32-ora10-odbclt-clnt-only_mv.msi" -- curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/product_family/uda" -- curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/product_category/odbc" -- curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/dbms_family/MySQL" -- curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/product_release/odbc-oracle-mt_6.1_i686-generic-win-32_ora9" -- curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/license_model/6.1_odbc-sqlserver-st_1_2_1" curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/rdfbrowser/index.html?uri=http%3A//data.openlinksw.com/oplweb/component_archive/6.1-odbc-oracle-st-i686-generic-win-32-ora10-odbclt-clnt-only_mv.msi" curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/product_family/uda" curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/product_release/odbc-oracle-mt_6.1_i686-generic-win-32_ora9" curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/license_model/6.1_odbc-sqlserver-st_1_2_1" -- -- XXX: note , the below would work only if www.openlinksw.com has the GRAPH <http://data.openlinksw.com/oplweb/> -- if experimenting on other box, then www.openlinksw.com should be replaced with [URIQA] DefaultHost INI value -- DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oplweb2_rule2', 1, '/oplweb(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//data.openlinksw.com/oplweb%U%%23this%%3E+%%3Fp+%%3Fo+}+FROM+%%3Chttp%%3A//www.openlinksw.com/dataspace/organization/openlink/oplweb/%%3E+WHERE+{+%%3Chttp%%3A//data.openlinksw.com/oplweb%U%%23this%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oplweb2_rule1', 1, '(/oplweb/[^#]*)', vector('path'), 1, '/rdfbrowser/index.html?uri=http%%3A//data.openlinksw.com%U%', -- '/DAV/RDF/rdfqry.vsp?uri=http%%3A//data.openlinksw.com%U%%23this', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oplweb2_rule3', 1, '(/[^#]*)/\x24', vector('path'), 1, '%s', vector('path'), null, null, 0, null ); create procedure DB.DBA.REDO_OPLWEB2_RDF_DET() { declare colid int; colid := DAV_SEARCH_ID('/DAV/RDF/oplweb2/', 'C'); if (colid < 0) return; update WS.WS.SYS_DAV_COL set COL_DET=null where COL_ID = colid; } ; DB.DBA.REDO_OPLWEB2_RDF_DET(); drop procedure DB.DBA.REDO_OPLWEB2_RDF_DET; DB.DBA."RDFData_MAKE_DET_COL" ('/DAV/RDF/oplweb2/', 'http://data.openlinksw.com/oplweb', NULL); VHOST_REMOVE (lpath=>'/oplweb/data/rdf'); DB.DBA.VHOST_DEFINE (lpath=>'/oplweb/data/rdf', ppath=>'/DAV/RDF/oplweb2/All/', is_dav=>1, vsp_user=>'dba'); -- procedure to convert path to DET resource name create procedure DB.DBA.OPLWEB2_DET_REF (in par varchar, in fmt varchar, in val varchar) { declare res, iri any; iri := 'http://data.openlinksw.com/oplweb' || val; res := sprintf ('iid (%d).rdf', iri_id_num (iri_to_id (iri))); return sprintf (fmt, res); } ; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('oplweb2_rdf', 1, '/oplweb/(.*)', vector('path'), 1, '/oplweb/data/rdf/%U', vector('path'), 'DB.DBA.OPLWEB2_DET_REF', 'application/rdf.xml', 2, 303); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'oplweb2_rule_list1', 1, vector ( 'oplweb2_rule1', 'oplweb2_rule2', 'oplweb2_rule3', 'oplweb2_rdf' )); VHOST_REMOVE (vhost=>'data.openlinksw.com:80', lpath=>'/oplweb'); DB.DBA.VHOST_DEFINE (vhost=>'data.openlinksw.com:80', lpath=>'/oplweb', ppath=>'/DAV/RDF/oplweb2/', vsp_user=>'dba', is_dav=>1, def_page=>'sfront.vspx', is_brws=>0, opts=>vector ('url_rewrite', 'oplweb2_rule_list1')); /* DB.DBA.VHOST_DEFINE (vhost=>'data.openlinksw.com:80', lhost=>':80', lpath=>'/rdf_net', ppath=>'/rdf_net'); DB.DBA.VHOST_DEFINE (vhost=>'data.openlinksw.com:80', lhost=>':80', lpath=>'/sparql/', ppath => '/!sparql/', is_dav => 1, vsp_user => 'dba', opts => vector('noinherit', 1)); VHOST_REMOVE (vhost=>'data.openlinksw.com', lpath=>'/proxy'); DB.DBA.VHOST_DEFINE (vhost=>'data.openlinksw.com', lhost=>':80', lpath=>'/proxy', ppath=>'/SOAP/Http/ext_http_proxy', soap_user=>'PROXY'); DB.DBA.VHOST_DEFINE (vhost=>'data.openlinksw.com:80', lhost=>':80', lpath=>'/xml_a', ppath=>'/SOAP/',soap_user=>'XML_A'); DB.DBA.VHOST_DEFINE (vhost=>'data.openlinksw.com:80', lhost=>':80', lpath=>'/XMLA', ppath=>'/SOAP/', soap_user=>'XMLA', soap_opts => vector ('ServiceName', 'XMLAnalysis', 'elementFormDefault', 'qualified')) GRANT EXECUTE ON DB.DBA.RDF_SPONGE_UP TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON DB.DBA.TTLP_EV_NEW_GRAPH TO "SPARQL", "SPARQL_UPDATE"; grant SPARQL_UPDATE to "SPARQL"; curl -H "Accept: application/rdf+xml" "http://data.openlinksw.com/oplweb/product_family/uda#this" SELECT hs_local_iri, exec ('sparql clear graph <'||hs_local_iri||'>') from sys_http_sponge; */ OWL based Ontology --sparql construct { ?x ?y ?z } from --<http://www.openlinksw.com/dataspace/organization/openlink#this> -- where { ?x ?y ?z } DB.DBA.RDF_LOAD_RDFXML_MT ( '<?xml version="1.0"?> <rdf:RDF xmlns="http://www.openlinksw.com/dataspace/organization/openlink/oplweb#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:virtrdf="http://www.openlinksw.com/schemas/virtrdf#" xml:base="http://www.openlinksw.com/schemas/oplweb#"> <owl:Ontology rdf:about="http://www.openlinksw.com/schemas/oplweb#"> <rdfs:label>ProductPortfolio</rdfs:label> <rdfs:comment>OpenLink Product Portfolio</rdfs:comment> <virtrdf:catName>oplweb</virtrdf:catName> <virtrdf:version>1.00</virtrdf:version> </owl:Ontology> <!-- Family / Category / Format --> <rdfs:Class rdf:ID="ProductFamily"> <rdfs:label>Product Family</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Family </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="ProductCategory"> <rdfs:label>Product Category</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Category </rdfs:comment> <rdfs:subPropertyOf rdf:resource="#ProductFamily"/> </rdfs:Class> <rdfs:Class rdf:ID="ProductFormat"> <rdfs:label>Product Format</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Format </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="ProductFormatCategory"> <rdfs:label>Product Format Category</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Format Category </rdfs:comment> </rdfs:Class> <rdf:Property rdf:ID="ProductFamilyDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:label>Product Family Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductFamilyLongDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:label>Product Family Long Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductFamilyCode"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:label>Product Family Long Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductFormatDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductFormat"/> <rdfs:label>Product Format Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductFormatLongDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductFormat"/> <rdfs:label>Product Format Long Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductFormatCode"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductFormat"/> <rdfs:domain rdf:resource="#ProductFormatCategory"/> <rdfs:label>Product Format Long Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductCategoryDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductCategory"/> <rdfs:label>Product Category Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductCategoryLongDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductCategory"/> <rdfs:label>Product Category Long Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductCategoryCode"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductCategory"/> <rdfs:domain rdf:resource="#ProductFormatCategory"/> <rdfs:label>Product Category Long Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="hasProduct"> <rdfs:range rdf:resource="#Product"/> <rdfs:domain rdf:resource="#ProductCategory"/> <rdfs:domain rdf:resource="#ProductFormat"/> <rdfs:domain rdf:resource="#ProductFormatCategory"/> <rdfs:label>Product</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="hasCategory"> <rdfs:range rdf:resource="#ProductCategory"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:label>Product</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="hasFormat"> <rdfs:range rdf:resource="#ProductFormat"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:domain rdf:resource="#ProductFormat"/> <rdfs:label>Product</rdfs:label> </rdf:Property> <!-- Vendor --> <rdfs:Class rdf:ID="VendorCategoryFamily"> <rdfs:label>vendor_category_family</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> vendor_category_family </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="VendorCategory"> <rdfs:label>vendor_category</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> vendor_category </rdfs:comment> <rdfs:subClassOf rdf:resource="VendorCategoryFamily"/> </rdfs:Class> <rdfs:Class rdf:ID="Vendors"> <rdfs:label>vendors</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> vendors </rdfs:comment> <rdfs:subClassOf rdf:resource="VendorCategory"/> </rdfs:Class> <rdf:Property rdf:ID="VendorName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Vendors"/> <rdfs:label>vendor name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="VendorCategoryFamilyDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#VendorCategoryFamily"/> <rdfs:label>vendor_category_family_description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="VendorCategoryDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#VendorCategory"/> <rdfs:label>vendor_category_description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="isOfVendorCategory"> <rdfs:range rdf:resource="#VendorCategory"/> <rdfs:domain rdf:resource="#Vendors"/> <rdfs:label>vendor_category_description</rdfs:label> </rdf:Property> <!-- Opsys / DBMS --> <rdfs:Class rdf:ID="OpsysFamily"> <rdfs:label>Opsys Family</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Opsys Family </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="DbmsFamily"> <rdfs:label>Dbms Family</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Dbms Family </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="DbmsEngine"> <rdfs:label>Dbms Engine</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Dbms Engine </rdfs:comment> <rdfs:subClassOf rdf:resource="DbmsFamily"/> </rdfs:Class> <rdfs:Class rdf:ID="OpsysType"> <rdfs:label>Opsys Type</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Opsys Type </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="ProcessorMode"> <rdfs:label>Processor Mode</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Processor Mode </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="Processor"> <rdfs:label>Processor</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Processor </rdfs:comment> <rdfs:subClassOf rdf:resource="ProcessorFamily"/> </rdfs:Class> <rdfs:Class rdf:ID="ProcessorFamily"> <rdfs:label>Processor Family</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Processor Family </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="Opsys"> <rdfs:label>Dbms Engine</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> opsys </rdfs:comment> <rdfs:subClassOf rdf:resource="OpsysFamily"/> <rdfs:subClassOf rdf:resource="OpsysType"/> </rdfs:Class> <rdf:Property rdf:ID="OpsysFamilyName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#OpsysFamily"/> <rdfs:label>Opsys Family Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysFamilyRating"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#OpsysFamily"/> <rdfs:label>Opsys Family Rating</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysFamilyLicenseCode"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#OpsysFamily"/> <rdfs:label>Opsys Family License Code</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysFamilyVendor"> <rdfs:range rdf:resource="#Vendors"/> <rdfs:domain rdf:resource="#OpsysFamily"/> <rdfs:label>Opsys Family Vendor</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DbmsFamilyName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DbmsFamily"/> <rdfs:label>DBMS Family Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DbmsFamilyVendor"> <rdfs:range rdf:resource="#Vendors"/> <rdfs:domain rdf:resource="#DbmsFamily"/> <rdfs:label>DBMS Family Vendor</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DbmsName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DbmsEngine"/> <rdfs:label>DBMS Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DbmsVersion"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DbmsEngine"/> <rdfs:label>DBMS Version</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DbmsEngineRating"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DbmsEngine"/> <rdfs:label>DBMS Engine Rating</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DbmsEngineOldArchiveCode"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DbmsEngine"/> <rdfs:label>DBMS Engine old Archive Code</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DbmsUpwardCompatible"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DbmsEngine"/> <rdfs:label>DBMS Upward Compatible</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DbmsDownwardCompatible"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DbmsEngine"/> <rdfs:label>DBMS Downward Compatible</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysTypeDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#OpsysType"/> <rdfs:label>Opsys Type Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysTypeShortDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#OpsysType"/> <rdfs:label>Opsys Type Short Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Opsys"/> <rdfs:label>Opsys Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysVersion"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Opsys"/> <rdfs:label>Opsys Version</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysUpwardCompatible"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Opsys"/> <rdfs:label>Opsys Compatible</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysDownwardCompatible"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Opsys"/> <rdfs:label>Opsys Downward Compatible</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysLicenseCode"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Opsys"/> <rdfs:label>Opsys License Code</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysCommercialName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Opsys"/> <rdfs:label>Opsys Commercial Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysProcessor"> <rdfs:range rdf:resource="#Processor"/> <rdfs:domain rdf:resource="#Opsys"/> <rdfs:label>Opsys Processor</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OpsysEmulation"> <rdfs:range rdf:resource="#ProcessorMode"/> <rdfs:domain rdf:resource="#Opsys"/> <rdfs:label>Opsys Emulation Mode</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProcessorModeName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProcessorMode"/> <rdfs:label>Processor Mode Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProcessorName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Processor"/> <rdfs:label>Processor Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProcessorProcessorMode"> <rdfs:range rdf:resource="#ProcessorMode"/> <rdfs:domain rdf:resource="#Processor"/> <rdfs:label>Processor Mode</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProcessorDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Processor"/> <rdfs:label>Processor Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProcessorFamilyName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProcessorFamily"/> <rdfs:label>Processor Family Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProcessorFamilyDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProcessorFamily"/> <rdfs:label>Processor Family Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProcessorFamilyVendor"> <rdfs:range rdf:resource="#Vendors"/> <rdfs:domain rdf:resource="#ProcessorFamily"/> <rdfs:label>Processor Family Vendor</rdfs:label> </rdf:Property> <!-- Product / Product Release --> <rdfs:Class rdf:ID="Product"> <rdfs:label>Product</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product </rdfs:comment> <rdfs:subPropertyOf rdf:resource="#ProductFormat"/> <rdfs:subPropertyOf rdf:resource="#ProductCategory"/> </rdfs:Class> <rdfs:Class rdf:ID="ProductRelease"> <rdfs:label>Product Release</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Release </rdfs:comment> <rdfs:subClassOf rdf:resource="#Product"/> </rdfs:Class> <rdf:Property rdf:ID="ProductId"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:label>Product ID</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="isOfCategory"> <rdfs:range rdf:resource="#ProductCategory"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:label>Product Category</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="isOfFormat"> <rdfs:range rdf:resource="#ProductFormat"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:label>Product Category</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductDescription"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:label>Product Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductLongDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:label>Product Long Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductReleaseId"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:label>Product Release ID</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductReleaseOpsys"> <rdfs:range rdf:resource="#Opsys"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:label>Product Release Opsys</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductReleaseDbms"> <rdfs:range rdf:resource="#DbmsEngine"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:label>Product Release DBMS</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductReleaseUpwardCompatible"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:label>Product Release upward compatible</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductReleaseDownwardCompatible"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:label>Product Release downward compatible</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductReleaseSupported"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:label>Product Release Supported</rdfs:label> </rdf:Property> <!-- Components --> <rdfs:Class rdf:ID="Component"> <rdfs:label>Components</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Components </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="ComponentMode"> <rdfs:label>Component Mode</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Component </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="ComponentType"> <rdfs:label>Component</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Component Type </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="ComponentCategory"> <rdfs:label>Component Category</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Component </rdfs:comment> </rdfs:Class> <rdf:Property rdf:ID="ComponentModeDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentMode"/> <rdfs:label>Component Mode Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentModeShortDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentMode"/> <rdfs:label>Component Mode Short Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentTypeDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentType"/> <rdfs:label>Component Type Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentTypeShortDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentType"/> <rdfs:label>Component Type Short Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentCategoryDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentCategory"/> <rdfs:label>Component Category Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentCategoryLongDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentCategory"/> <rdfs:label>Component Category Long Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentCategoryShortDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentCategory"/> <rdfs:label>Component Category Short Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentCvsid"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components CVSID</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentBuildDate"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components Build Date</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Notes"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components Notes</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="BuildComments"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components Build Comments</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Filesize"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentComponentCategory"> <rdfs:range rdf:resource="#ComponentCategory"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components Component Category</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentComponentType"> <rdfs:range rdf:resource="#ComponentType"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components Component Type</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentComponentMode"> <rdfs:range rdf:resource="#ComponentMode"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components Component Mode</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentOpsys"> <rdfs:range rdf:resource="#Opsys"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components Opsys</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentDbmsEngine"> <rdfs:range rdf:resource="#DbmsEngine"/> <rdfs:domain rdf:resource="#Component"/> <rdfs:label>Components DBMS</rdfs:label> </rdf:Property> <!-- Component Archives --> <rdfs:Class rdf:ID="ComponentArchive"> <rdfs:label>Component Archive</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Component Archives </rdfs:comment> <rdfs:subClassOf rdf:resource="#ProductRelease"/> <rdfs:subClassOf rdf:resource="#Component"/> </rdfs:Class> <rdfs:Class rdf:ID="ComponentArchiveType"> <rdfs:label>Component Archive Type</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Component Archives Type </rdfs:comment> </rdfs:Class> <rdf:Property rdf:ID="ComponentArchiveTypeName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchiveType"/> <rdfs:label>Component Archive Type Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveTypeShortName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchiveType"/> <rdfs:label>Component Archive Type Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveTypeExtension"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchiveType"/> <rdfs:label>Component Archive Type Extension</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveComponentArchiveType"> <rdfs:range rdf:resource="#ComponentArchiveType"/> <rdfs:domain rdf:resource="#ComponentArchive"/> <rdfs:label>Component Archive Component Archive Type</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveName"> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchive"/> <rdfs:label>Component Archive Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveAssemblyDate"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchive"/> <rdfs:label>Component Archive Assembly Date</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveFileUri"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchive"/> <rdfs:label>Component Archive File URI</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveLicenseCode"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchive"/> <rdfs:label>Component Archive License Code</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveResName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchive"/> <rdfs:label>Component Archive DAV Resource Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveResFullPath"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchive"/> <rdfs:label>Component Archive DAV Full Path</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ComponentArchiveResFileSize"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ComponentArchive"/> <rdfs:label>Component Archive File Size in DAV</rdfs:label> </rdf:Property> <!-- Download locations --> <rdfs:Class rdf:ID="DownloadLocation"> <rdfs:label>Download Location</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Download Location </rdfs:comment> <rdfs:subClassOf rdf:resource="#ComponentArchive"/> <rdfs:subClassOf rdf:resource="#DownloadPartner"/> <rdfs:subClassOf rdf:resource="#DownloadProtocol"/> </rdfs:Class> <rdfs:Class rdf:ID="DownloadProtocol"> <rdfs:label>Download Protocol</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Download Protocol </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="DownloadPartner"> <rdfs:label>Download Partner</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Download Partner </rdfs:comment> </rdfs:Class> <rdf:Property rdf:ID="ProtocolName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DownloadProtocol"/> <rdfs:label>Protocol Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProtocolDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DownloadProtocol"/> <rdfs:label>Protocol Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProtocolActive"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DownloadProtocol"/> <rdfs:label>Protocol Active</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="PartnerName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DownloadPartner"/> <rdfs:label>Download Partner Partner Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="HostName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DownloadPartner"/> <rdfs:label>Download Partner Hostname</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DomainName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DownloadPartner"/> <rdfs:label>Download Partner Domain Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="PortNumber"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DownloadPartner"/> <rdfs:label>Download Partner Port Number</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Uri"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DownloadLocation"/> <rdfs:label>Download Location URI</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="UriOld"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#DownloadLocation"/> <rdfs:label>Download Location URI Old</rdfs:label> </rdf:Property> <!-- Features and Benefits --> <rdfs:Class rdf:ID="ProductBenefit"> <rdfs:label>Product Benefit</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Benefit </rdfs:comment> <rdfs:subClassOf rdf:resource="#ProductBenefitCategory"/> </rdfs:Class> <rdfs:Class rdf:ID="ProductBenefitCategory"> <rdfs:label>Product Benefit</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Benefit </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="ProductFeatureCategory"> <rdfs:label>Product Feature Category</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Feature Category </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="ProductFeature"> <rdfs:label>Product Features</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Features </rdfs:comment> <rdfs:subClassOf rdf:resource="#ProductFeatureCategory"/> <rdfs:subClassOf rdf:resource="#ProductBenefit"/> <rdfs:subClassOf rdf:resource="#Product"/> </rdfs:Class> <rdfs:Class rdf:ID="ProductFamilyFeature"> <rdfs:label>Product Family Features</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Family Features </rdfs:comment> <rdfs:subClassOf rdf:resource="#ProductFeatureCategory"/> <rdfs:subClassOf rdf:resource="#ProductBenefit"/> <rdfs:subClassOf rdf:resource="#ProductFamily"/> </rdfs:Class> <rdfs:Class rdf:ID="ProductFormatFeature"> <rdfs:label>Product Format Features</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Format Features </rdfs:comment> <rdfs:subClassOf rdf:resource="#ProductFeatureCategory"/> <rdfs:subClassOf rdf:resource="#ProductBenefit"/> <rdfs:subClassOf rdf:resource="#ProductFormat"/> </rdfs:Class> <rdfs:Class rdf:ID="ProductCategoryFeature"> <rdfs:label>Product Category Features</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Category Features </rdfs:comment> <rdfs:subClassOf rdf:resource="#ProductFeatureCategory"/> <rdfs:subClassOf rdf:resource="#ProductBenefit"/> <rdfs:subClassOf rdf:resource="#ProductCategory"/> </rdfs:Class> <rdfs:Class rdf:ID="ProductReleaseFeature"> <rdfs:label>Product Benefit</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Product Benefit </rdfs:comment> <rdfs:subClassOf rdf:resource="#ProductFeatureCategory"/> <rdfs:subClassOf rdf:resource="#ProductBenefit"/> <rdfs:subClassOf rdf:resource="#ProductRelease"/> </rdfs:Class> <rdf:Property rdf:ID="ProductBenefitsCategoryDescription"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductBenefitsCategory"/> <rdfs:label>product Benefits Category</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Description"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductBenefit"/> <rdfs:domain rdf:resource="#ProductBenefitCategory"/> <rdfs:domain rdf:resource="#ProductFeatureCategory"/> <rdfs:domain rdf:resource="#ProductFeature"/> <rdfs:domain rdf:resource="#ProductFamilyFeature"/> <rdfs:domain rdf:resource="#ProductFormatFeature"/> <rdfs:domain rdf:resource="#ProductCategoryFeature"/> <rdfs:domain rdf:resource="#ProductReleaseFeature"/> <rdfs:label>Product Benefits Description</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Details"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductFeature"/> <rdfs:domain rdf:resource="#ProductFamilyFeature"/> <rdfs:domain rdf:resource="#ProductFormatFeature"/> <rdfs:domain rdf:resource="#ProductCategoryFeature"/> <rdfs:domain rdf:resource="#ProductReleaseFeature"/> <rdfs:label>Product Benefits Description Details</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductBenefitsAcronym"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductBenefit"/> <rdfs:label>Product Benefits Acronym</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductBenefitsExplanation"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductBenefit"/> <rdfs:label>Product Benefits Explanation</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="DemoUrl"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductCategoryFeature"/> <rdfs:domain rdf:resource="#ProductFormatFeature"/> <rdfs:domain rdf:resource="#ProductFamilyFeature"/> <rdfs:domain rdf:resource="#ProductReleaseFeature"/> <rdfs:label>The Features Demo URL</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="HypesPerSecond"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/> <rdfs:domain rdf:resource="#ProductCategoryFeature"/> <rdfs:domain rdf:resource="#ProductFormatFeature"/> <rdfs:domain rdf:resource="#ProductFamilyFeature"/> <rdfs:domain rdf:resource="#ProductreleaseFeature"/> <rdfs:label>The Features Number of Hypes per second</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Implemented"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#ProductCategoryFeature"/> <rdfs:domain rdf:resource="#ProductFormatFeature"/> <rdfs:domain rdf:resource="#ProductFamilyFeature"/> <rdfs:domain rdf:resource="#ProductReleaseFeature"/> <rdfs:label>The Features Short Description</rdfs:label> </rdf:Property> <!-- shop / pricing stuff --> <rdfs:Class rdf:ID="LicenseType"> <rdfs:label>License Type</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> License Type </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="UnitType"> <rdfs:label>Unit Type</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Unit Type </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="GeneralDiscount"> <rdfs:label>General Discount</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> General Discount </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="IncrementalDiscount"> <rdfs:label>Incremental Discount</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> Incremental Discount </rdfs:comment> </rdfs:Class> <rdfs:Class rdf:ID="License"> <rdfs:label>License</rdfs:label> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> License </rdfs:comment> <rdfs:subClassOf rdf:resource="#LicenseType"/> <rdfs:subClassOf rdf:resource="#ProductRelease"/> </rdfs:Class> <rdf:Property rdf:ID="BaseCostUnit"> <rdfs:range rdf:resource="#UnitType"/> <rdfs:domain rdf:resource="#License"/> <rdfs:label>Base Unit Cost</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="PriceUnit"> <rdfs:range rdf:resource="#UnitType"/> <rdfs:domain rdf:resource="#License"/> <rdfs:label>Price Unit Cost</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="hasDiscount"> <rdfs:range rdf:resource="#IncrementalDiscount"/> <rdfs:domain rdf:resource="#UnitType"/> <rdfs:label>Base Unit Cost</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="hasGeneralDiscount"> <rdfs:range rdf:resource="#GeneralDiscount"/> <rdfs:domain rdf:resource="#License"/> <rdfs:label>General Discount</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="unitValue"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#UnitType"/> <rdfs:label>Unit Value</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="graceUnit"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#UnitType"/> <rdfs:label>Grace Unit</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="minUnits"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#UnitType"/> <rdfs:label>Minimum Units</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="maxUnits"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#UnitType"/> <rdfs:label>Maximum Units</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="codeWord"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#GeneralDiscount"/> <rdfs:label>Code Word needed to activate this discount</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="startDate"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#GeneralDiscount"/> <rdfs:label>Discount Start Date</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="endDate"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#GeneralDiscount"/> <rdfs:label>Discount End Date</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="percentageOfCost"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#GeneralDiscount"/> <rdfs:label>Percentage of cost attributing as discount</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="triggerPoint"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#IncrementalDiscount"/> <rdfs:label>Discount Trigger Point</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="percentageOfBase"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#IncrementalDiscount"/> <rdfs:label>Percentage of base cost attributing as discount</rdfs:label> </rdf:Property> <!-- common properties --> <rdf:Property rdf:ID="label"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://www.w3.org/2001/XMLSchema#label"/> <rdfs:domain rdf:resource="#ProductCategory"/> <rdfs:domain rdf:resource="#ProductFormat"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:domain rdf:resource="#VendorCategory"/> <rdfs:domain rdf:resource="#Vendor"/> <rdfs:domain rdf:resource="#OpsysFamily"/> <rdfs:domain rdf:resource="#DbmsFamily"/> <rdfs:domain rdf:resource="#DbmsEngine"/> <rdfs:domain rdf:resource="#OpsysType"/> <rdfs:domain rdf:resource="#Processor"/> <rdfs:domain rdf:resource="#ProcessorFamily"/> <rdfs:domain rdf:resource="#Opsys"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:domain rdf:resource="#ComponentMode"/> <rdfs:domain rdf:resource="#ComponentType"/> <rdfs:domain rdf:resource="#ComponentCategory"/> <rdfs:domain rdf:resource="#ComponentArchive"/> <rdfs:domain rdf:resource="#ComponentArchiveType"/> <rdfs:domain rdf:resource="#DownloadLocation"/> <rdfs:domain rdf:resource="#ProductBenefit"/> <rdfs:domain rdf:resource="#ProductBenefitCategory"/> <rdfs:domain rdf:resource="#ProductFeatureCategory"/> <rdfs:domain rdf:resource="#ProductFeature"/> <rdfs:domain rdf:resource="#ProductFamilyFeature"/> <rdfs:domain rdf:resource="#ProductFormatFeature"/> <rdfs:domain rdf:resource="#ProductCategoryFeature"/> <rdfs:domain rdf:resource="#ProductReleaseFeature"/> <rdfs:domain rdf:resource="#LicenseModel"/> <rdfs:domain rdf:resource="#Discount"/> <rdfs:domain rdf:resource="#PriceType"/> <rdfs:domain rdf:resource="#PriceUnitType"/> <rdfs:label>Label</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="name"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:domain rdf:resource="#ProductCategory"/> <rdfs:domain rdf:resource="#ProductFormat"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:label>Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="logo"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/logo"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:label>logo</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="homepage"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/homepage"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:domain rdf:resource="#ProcessorFamily"/> <rdfs:domain rdf:resource="#OpsysFamily"/> <rdfs:domain rdf:resource="#DbmsFamily"/> <rdfs:label>homepage</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="maker"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/maker"/> <rdfs:domain rdf:resource="#ProductCategory"/> <rdfs:domain rdf:resource="#ProductFormat"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:label>Maker</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="sameAs"> <rdfs:range rdf:resource="owl#sameAs"/> <rdfs:domain rdf:resource="#ProductCategory"/> <rdfs:domain rdf:resource="#ProductFormat"/> <rdfs:domain rdf:resource="#ProductFamily"/> <rdfs:domain rdf:resource="#ProductRelease"/> <rdfs:domain rdf:resource="#ProductFormatCategory"/> <rdfs:label>Name</rdfs:label> </rdf:Property> </rdf:RDF> ', 'http://www.openlinksw.com/schemas/oplweb#', 'http://www.openlinksw.com/schemas/oplweb#') --'http://www.openlinksw.com/dataspace/organization/openlink/ProductPortfolioOntology/1.0/') ; rdfs_rule_set ('oplweb2_owlset', 'http://www.openlinksw.com/schemas/oplweb#', 1); DB.DBA.XML_SET_NS_DECL ('opl', 'http://www.openlinksw.com/schemas/oplweb#', 2);
-- Setup script for RDF views of Sybase 15 PUBS2 Sample Database -- DB..vd_remote_data_source ('syb15ma-pubs2', '', '<uid>','<pwd>'); ATTACH TABLE "pubs2.dbo.au_pix" PRIMARY KEY ("au_id") AS "pubs2"."syb"."au_pix" FROM 'syb15ma-pubs2'; ATTACH TABLE "pubs2.dbo.authors" PRIMARY KEY ("au_id") AS "pubs2"."syb"."authors" FROM 'syb15ma-pubs2'; ATTACH TABLE "pubs2.dbo.discounts" PRIMARY KEY ("stor_id") AS "pubs2"."syb"."discounts" FROM 'syb15ma-pubs2'; ATTACH TABLE "pubs2.dbo.publishers" PRIMARY KEY ("pub_id") AS "pubs2"."syb"."publishers" FROM 'syb15ma-pubs2'; ATTACH TABLE "pubs2.dbo.roysched" PRIMARY KEY ("title_id") AS "pubs2"."syb"."roysched" FROM 'syb15ma-pubs2'; ATTACH TABLE "pubs2.dbo.sales" PRIMARY KEY ("stor_id", "ord_num") AS "pubs2"."syb"."sales" FROM 'syb15ma-pubs2'; ATTACH TABLE "pubs2.dbo.salesdetail" PRIMARY KEY ("stor_id", "ord_num", "title_id") AS "pubs2"."syb"."salesdetail" FROM 'syb15ma-pubs2'; ATTACH TABLE "pubs2.dbo.stores" PRIMARY KEY ("stor_id") AS "pubs2"."syb"."stores" FROM 'syb15ma-pubs2'; ATTACH TABLE "pubs2.dbo.titleauthor" PRIMARY KEY ("au_id", "title_id") AS "pubs2"."syb"."titleauthor" FROM 'syb15ma-pubs2'; ATTACH TABLE "pubs2.dbo.titles" PRIMARY KEY ("title_id", "pub_id") AS "pubs2"."syb"."titles" FROM 'syb15ma-pubs2'; COMMIT WORK; GRANT SELECT ON pubs2.syb.au_pix TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON pubs2.syb.authors TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON pubs2.syb.discounts TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON pubs2.syb.publishers TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON pubs2.syb.roysched TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON pubs2.syb.sales TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON pubs2.syb.salesdetail TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON pubs2.syb.stores TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON pubs2.syb.titleauthor TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON pubs2.syb.titles TO "SPARQL", "SPARQL_UPDATE"; ------------------------------------------------------------------- -------- Create rdfs:Class definitions ---------------------------- ttlp ( ' @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix syb: <http://localhost:8890/schemas/sybasepubs2/> . syb:titles a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "titles" ; rdfs:comment "Sybase Pubs2 titles table" . syb:title_id a rdf:Property ; rdfs:domain syb:titles ; rdfs:range xsd:string ; rdfs:label "title id" . syb:title a rdf:Property ; rdfs:domain syb:titles ; rdfs:range xsd:string ; rdfs:label "title" . syb:type a rdf:Property ; rdfs:domain syb:titles ; rdfs:range xsd:string ; rdfs:label "type" . syb:pub_id a rdf:Property ; rdfs:domain syb:titles ; rdfs:range syb:publishers ; rdfs:label "pub_id" . syb:advance a rdf:Property ; rdfs:domain syb:titles ; rdfs:range xsd:decimal ; rdfs:label "advance" . syb:price a rdf:Property ; rdfs:domain syb:titles ; rdfs:range xsd:decimal ; rdfs:label "price" . syb:total_sales a rdf:Property ; rdfs:domain syb:titles ; rdfs:range xsd:integer ; rdfs:label "total_sales" . syb:notes a rdf:Property ; rdfs:domain syb:titles ; rdfs:range xsd:string ; rdfs:label "notes" . syb:contract a rdf:Property ; rdfs:domain syb:titles ; rdfs:range xsd:integer ; rdfs:label "contract" . syb:pubdate a rdf:Property ; rdfs:domain syb:titles ; rdfs:range xsd:dateTime ; rdfs:label "publish date" . syb:authors a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "authors" ; rdfs:comment "Sybase Pubs2 authors table" . syb:au_id a rdf:Property ; rdfs:domain syb:authors ; rdfs:range xsd:string ; rdfs:label "author id" . syb:au_lname a rdf:Property ; rdfs:domain syb:authors ; rdfs:range xsd:string ; rdfs:label "author last name" . syb:au_fname a rdf:Property ; rdfs:domain syb:authors ; rdfs:range xsd:string ; rdfs:label "author first name" . syb:phone a rdf:Property ; rdfs:domain syb:authors ; rdfs:range xsd:string ; rdfs:label "phone number" . syb:address a rdf:Property ; rdfs:domain syb:authors ; rdfs:range xsd:string ; rdfs:label "address" . syb:city a rdf:Property ; rdfs:domain syb:authors ; rdfs:range xsd:string ; rdfs:label "city" . syb:state a rdf:Property ; rdfs:domain syb:authors ; rdfs:range xsd:string ; rdfs:label "state" . syb:country a rdf:Property ; rdfs:domain syb:authors ; rdfs:range xsd:string ; rdfs:label "country" . syb:postalcode a rdf:Property ; rdfs:domain syb:authors ; rdfs:range xsd:string ; rdfs:label "postalcode" . syb:stores a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "stores" ; rdfs:comment "Sybase Pubs2 stores table" . syb:stor_id a rdf:Property ; rdfs:domain syb:stores ; rdfs:range xsd:string ; rdfs:label "store id" . syb:stor_name a rdf:Property ; rdfs:domain syb:stores ; rdfs:range xsd:string ; rdfs:label "store name" . syb:stor_address a rdf:Property ; rdfs:domain syb:stores ; rdfs:range xsd:string ; rdfs:label "store address" . syb:city a rdf:Property ; rdfs:domain syb:stores ; rdfs:range xsd:string ; rdfs:label "city" . syb:state a rdf:Property ; rdfs:domain syb:stores ; rdfs:range xsd:string ; rdfs:label "state" . syb:country a rdf:Property ; rdfs:domain syb:stores ; rdfs:range xsd:string ; rdfs:label "country" . syb:postalcode a rdf:Property ; rdfs:domain syb:stores ; rdfs:range xsd:string ; rdfs:label "postal code" . syb:payterms a rdf:Property ; rdfs:domain syb:stores ; rdfs:range xsd:string ; rdfs:label "payment terms" . syb:au_pix a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "authors pictures" ; rdfs:comment "Sybase Pubs2 au_pix table" . syb:au_id a rdf:Property ; rdfs:domain syb:au_pix ; rdfs:range syb:authors ; rdfs:label "author id" . syb:format_type a rdf:Property ; rdfs:domain syb:au_pix ; rdfs:range xsd:string ; rdfs:label "format type" . syb:bytesize a rdf:Property ; rdfs:domain syb:au_pix ; rdfs:range xsd:integer ; rdfs:label "byte size" . syb:pixwidth_hor a rdf:Property ; rdfs:domain syb:au_pix ; rdfs:range xsd:string ; rdfs:label "picture horizontal width" . syb:pixwidth_vert a rdf:Property ; rdfs:domain syb:au_pix ; rdfs:range xsd:string ; rdfs:label "picture vertical width" . syb:discounts a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "discounts" ; rdfs:comment "Sybase Pubs2 discount table" . syb:discounttype a rdf:Property ; rdfs:domain syb:discounts ; rdfs:range xsd:string ; rdfs:label "discounttype" . syb:stor_id a rdf:Property ; rdfs:domain syb:discounts ; rdfs:range syb:stores ; rdfs:label "store id" . syb:lowqty a rdf:Property ; rdfs:domain syb:discounts ; rdfs:range xsd:integer ; rdfs:label "min quantity" . syb:highqty a rdf:Property ; rdfs:domain syb:discounts ; rdfs:range xsd:integer ; rdfs:label "max quantity" . syb:discount a rdf:Property ; rdfs:domain syb:discounts ; rdfs:range xsd:decimal ; rdfs:label "min quantity" . syb:salesdetail a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "sales details" ; rdfs:comment "Sybase Pubs2 sales detail table" . syb:store_id a rdf:Property ; rdfs:domain syb:salesdetail ; rdfs:range syb:stores ; rdfs:label "store id" . syb:ord_num a rdf:Property ; rdfs:domain syb:salesdetail ; rdfs:range syb:sales ; rdfs:label "order number" . syb:title_id a rdf:Property ; rdfs:domain syb:salesdetail ; rdfs:range syb:titles ; rdfs:label "title id" . syb:qty a rdf:Property ; rdfs:domain syb:salesdetail ; rdfs:range xsd:integer ; rdfs:label "quantity" . syb:discount a rdf:Property ; rdfs:domain syb:salesdetail ; rdfs:range xsd:decimal ; rdfs:label "discount" . syb:publishers a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "Publishers" ; rdfs:comment "Sybase Pubs2 publishers table" . syb:pub_id a rdf:Property ; rdfs:domain syb:publishers ; rdfs:range xsd:string ; rdfs:label "publisher id" . syb:pub_name a rdf:Property ; rdfs:domain syb:publishers ; rdfs:range xsd:string ; rdfs:label "publisher name" . syb:city a rdf:Property ; rdfs:domain syb:publishers ; rdfs:range xsd:string ; rdfs:label "city" . syb:state a rdf:Property ; rdfs:domain syb:publishers ; rdfs:range xsd:string ; rdfs:label "state" . syb:titleauthor a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "title author" ; rdfs:comment "Sybase Pubs2 titleauthor table" . syb:au_id a rdf:Property ; rdfs:domain syb:titleauthor ; rdfs:range syb:authors ; rdfs:label "author id" . syb:title_id a rdf:Property ; rdfs:domain syb:titleauthor ; rdfs:range syb:titles ; rdfs:label "title id" . syb:au_ord a rdf:Property ; rdfs:domain syb:titleauthor ; rdfs:range xsd:integer ; rdfs:label "author order" . syb:royaltyper a rdf:Property ; rdfs:domain syb:titleauthor ; rdfs:range xsd:integer ; rdfs:label "royalty per book" . syb:roysched a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "Royalty Schedule" ; rdfs:comment "Sybase Pubs2 roysched table" . syb:title_id a rdf:Property ; rdfs:domain syb:roysched ; rdfs:range syb:titles ; rdfs:label "title id" . syb:lorange a rdf:Property ; rdfs:domain syb:roysched ; rdfs:range xsd:integer ; rdfs:label "low range" . syb:hirange a rdf:Property ; rdfs:domain syb:roysched ; rdfs:range xsd:integer ; rdfs:label "high range" . syb:royalty a rdf:Property ; rdfs:domain syb:roysched ; rdfs:range xsd:integer ; rdfs:label "royalty" . syb:sales a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/sybasepubs2> ; rdfs:label "Sales" ; rdfs:comment "Sybase Pubs2 sales table" . syb:stor_id a rdf:Property ; rdfs:domain syb:sales ; rdfs:range xsd:string ; rdfs:label "store id" . syb:ord_num a rdf:Property ; rdfs:domain syb:sales ; rdfs:range xsd:string ; rdfs:label "order number" . syb:date a rdf:Property ; rdfs:domain syb:sales ; rdfs:range xsd:dateTime ; rdfs:label "date" . ', '', 'http://localhost:8890/schemas/sybasepubs2', 0); --------------------------------------------------------------- ----------- Create IRI Classes ------------- SPARQL create iri class <http://localhost:8890/schemas/sybasepubs2/titles_iri> "http://^{URIQADefaultHost}^/sybasepubs2/titles/%s_%s#this" (in title_id varchar not null, in title varchar not null) . create iri class <http://localhost:8890/schemas/sybasepubs2/authors_iri> "http://^{URIQADefaultHost}^/sybasepubs2/authors/%s#this" (in au_id varchar not null) . create iri class <http://localhost:8890/schemas/sybasepubs2/stores_iri> "http://^{URIQADefaultHost}^/sybasepubs2/stores/%s#this" (in stor_id varchar not null) . create iri class <http://localhost:8890/schemas/sybasepubs2/au_pix_iri> "http://^{URIQADefaultHost}^/sybasepubs2/au_pix/%s#this" (in au_id varchar not null) . create iri class <http://localhost:8890/schemas/sybasepubs2/discounts_iri> "http://^{URIQADefaultHost}^/sybasepubs2/discounts/%s#this" (in discounttype varchar not null) . create iri class <http://localhost:8890/schemas/sybasepubs2/salesdetail_iri> "http://^{URIQADefaultHost}^/sybasepubs2/salesdetail/%s_%s_%s#this" (in stor_id varchar not null, in ord_num varchar not null, in title_id varchar not null) . create iri class <http://localhost:8890/schemas/sybasepubs2/publishers_iri> "http://^{URIQADefaultHost}^/sybasepubs2/publishers/%s#this" (in pub_id varchar not null) . create iri class <http://localhost:8890/schemas/sybasepubs2/titleauthor_iri> "http://^{URIQADefaultHost}^/sybasepubs2/titleauthor/%s_%s#this" (in au_id varchar not null, in title_id varchar not null) . create iri class <http://localhost:8890/schemas/sybasepubs2/roysched_iri> "http://^{URIQADefaultHost}^/sybasepubs2/roysched/%s#this" (in title_id varchar not null) . create iri class <http://localhost:8890/schemas/sybasepubs2/sales_iri> "http://^{URIQADefaultHost}^/sybasepubs2/sales/%s_%s#this" (in stor_id varchar not null, in ord_num varchar not null) . ; -------------------------------------------------------------------- ------------- Create Quad Store ------------------------------------ SPARQL prefix syb: <http://localhost:8890/schemas/sybasepubs2/> alter quad storage virtrdf:DefaultQuadStorage from pubs2.syb.au_pix as au_pix_tbl from pubs2.syb.authors as authors_tbl from pubs2.syb.discounts as discounts_tbl from pubs2.syb.publishers as publishers_tbl from pubs2.syb.roysched as roysched_tbl from pubs2.syb.sales as sales_tbl from pubs2.syb.salesdetail as salesdetail_tbl from pubs2.syb.stores as stores_tbl from pubs2.syb.titleauthor as titleauthor_tbl from pubs2.syb.titles as titles_tbl { create virtrdf:sybasepubs2 as graph <http://localhost:8890/sybasepubs2> { syb:au_pix_iri (au_pix_tbl.au_id) a syb:au_pix as virtrdf:au_pix_id; syb:au_id au_pix_tbl.au_id as virtrdf:au_pix_au_id; syb:format_type au_pix_tbl.format_type as virtrdf:au_pix_format_type; syb:bytesize au_pix_tbl.bytesize as virtrdf:au_pix_bytesize; syb:pixwidth_hor au_pix_tbl.pixwidth_hor as virtrdf:au_pix_pixwidth_hor; syb:pixwidth_vert au_pix_tbl.pixwidth_vert as virtrdf:au_pix_pixwidth_vert ; syb:has_author syb:authors_iri(authors_tbl.au_id) where (^{authors_tbl.}^.au_id = ^{au_pix_tbl.}^.au_id) as virtrdf:au_pix_has_author . syb:authors_iri (authors_tbl.au_id) a syb:authors as virtrdf:authors_pk ; syb:au_id authors_tbl.au_id as virtrdf:authors_au_id; syb:au_lname authors_tbl.au_lname as virtrdf:authors_au_lname; syb:au_fname authors_tbl.au_fname as virtrdf:authors_au_fname; syb:phone authors_tbl.phone as virtrdf:authors_phone; syb:address authors_tbl.address as virtrdf:authors_address; syb:city authors_tbl.city as virtrdf:authors_city; syb:state authors_tbl.state as virtrdf:authors_state; syb:country authors_tbl.country as virtrdf:authors_country; syb:postalcode authors_tbl.postalcode as virtrdf:authors_postalcode; syb:has_title syb:titleauthor_iri(titleauthor_tbl.au_id, titleauthor_tbl.title_id) where (^{titleauthor_tbl.}^.au_id = ^{authors_tbl.}^.au_id) as virtrdf:authors_has_title; syb:has_pix syb:au_pix_iri(au_pix_tbl.au_id) where (^{au_pix_tbl.}^.au_id = ^{authors_tbl.}^.au_id) as virtrdf:authors_has_pix . syb:discounts_iri (discounts_tbl.stor_id) a syb:discounts as virtrdf:discounts_pk; syb:discounttype discounts_tbl.discounttype as virtrdf:discounts_discounttype; syb:stor_id syb:stores_iri(stores_tbl.stor_id) where (^{stores_tbl.}^.stor_id = ^{stores_tbl.}^.stor_id) as virtrdf:discounts_stor_id; syb:lowqty discounts_tbl.lowqty as virtrdf:discounts_lowqty; syb:highqty discounts_tbl.highqty as virtrdf:discounts_highqty; syb:discount discounts_tbl.discount as virtrdf:discounts_discount . syb:publishers_iri (publishers_tbl.pub_id) a syb:publishers as virtrdf:publishers_pk; syb:pub_id syb:titles_iri(titles_tbl.title_id, titles_tbl.pub_id) where (^{titles_tbl.}^.pub_id = ^{titles_tbl.}^.pub_id) as virtrdf:publisherss_pub_id; syb:pub_name publishers_tbl.pub_name as virtrdf:publisherss_pub_name; syb:city publishers_tbl.city as virtrdf:publisherss_city; syb:state publishers_tbl.state as virtrdf:publisherss_state . syb:roysched_iri (roysched_tbl.title_id) a syb:roysched as virtrdf:roysched_pk; syb:title_id syb:titleauthor_iri(titleauthor_tbl.au_id, titleauthor_tbl.title_id) where (^{titleauthor_tbl.}^.title_id = ^{roysched_tbl.}^.title_id) as virtrdf:roysched_title_id; syb:lorange roysched_tbl.lorange as virtrdf:roysched_lorange; syb:hirange roysched_tbl.hirange as virtrdf:roysched_hirange; syb:royalty roysched_tbl.royalty as virtrdf:roysched_royalty . syb:sales_iri (sales_tbl.stor_id, sales_tbl.ord_num) a syb:sales as virtrdf:sales_pk; syb:stor_id sales_tbl.stor_id as virtrdf:sales_stor_id; syb:ord_num sales_tbl.ord_num as virtrdf:sales_ord_num; syb:date sales_tbl.date as virtrdf:sales_date; syb:has_salesdetail syb:salesdetail_iri(salesdetail_tbl.stor_id, salesdetail_tbl.ord_num, salesdetail_tbl.title_id) where (^{salesdetail_tbl.}^.stor_id = ^{sales_tbl.}^.stor_id and ^{salesdetail_tbl.}^.ord_num = ^{sales_tbl.}^.ord_num) as virtrdf:sales_has_salesdetail; syb:has_stores syb:stores_iri(stores_tbl.stor_id) where (^{stores_tbl.}^.stor_id = ^{sales_tbl.}^.stor_id) as virtrdf:sales_has_stores . syb:salesdetail_iri (salesdetail_tbl.stor_id, salesdetail_tbl.ord_num, salesdetail_tbl.title_id) a syb:salesdetail as virtrdf:salesdetail_pk; syb:stor_id salesdetail_tbl.stor_id as virtrdf:salesdetail_stor_id; syb:ord_num salesdetail_tbl.ord_num as virtrdf:salesdetail_ord_num; syb:title_id salesdetail_tbl.title_id as virtrdf:salesdetail_title_id; syb:qty salesdetail_tbl.qty as virtrdf:salesdeail_qty; syb:discount salesdetail_tbl.discount as virtrdf:salesdetail_discount; syb:has_title syb:titles_iri (titles_tbl.title_id, titles_tbl.pub_id) where (^{titles_tbl.}^.title_id = ^{salesdetail_tbl.}^.title_id) as virtrdf:salesdetail_has_title; syb:has_sales syb:sales_iri(sales_tbl.stor_id, sales_tbl.ord_num) where (^{salesdetail_tbl.}^.stor_id = ^{sales_tbl.}^.stor_id and ^{salesdetail_tbl.}^.ord_num = ^{sales_tbl.}^.ord_num ) as virtrdf:salesdetail_has_sales . syb:stores_iri (stores_tbl.stor_id) a syb:stores as virtrdf:stores_pk; syb:stor_id stores_tbl.stor_id as virtrdf:stores_stor_id; syb:stor_name stores_tbl.stor_name as virtrdf:stores_stor_name; syb:stor_address stores_tbl.stor_address as virtrdf:stores_stor_address; syb:city stores_tbl.city as virtrdf:stores_city; syb:state stores_tbl.state as virtrdf:stores_state; syb:country stores_tbl.country as virtrdf:stores_country; syb:postalcode stores_tbl.postalcode as virtrdf:stores_postalcode; syb:payterms stores_tbl.payterms as virtrdf:stores_payterms; syb:has_sales syb:sales_iri(sales_tbl.stor_id, sales_tbl.ord_num) where (^{sales_tbl.}^.stor_id = ^{stores_tbl.}^.stor_id) as virtrdf:stores_has_sales . syb:titleauthor_iri (titleauthor_tbl.au_id, titleauthor_tbl.title_id) a syb:titleauthor as virtrdf:titleauthor_pk; syb:au_id titleauthor_tbl.au_id as virtrdf:titleauthor_au_id; syb:title_id titleauthor_tbl.title_id as virtrdf:titleauthor_title_id; syb:au_ord titleauthor_tbl.au_ord as virtrdf:titleauthor_au_ord; syb:royaltyper titleauthor_tbl.royaltyper as virtrdf:titleauthor_royaltyper; syb:has_author syb:authors_iri(authors_tbl.au_id) where (^{authors_tbl.}^.au_id = ^{titleauthor_tbl.}^.au_id) as virtrdf:titleauthor_has_author; syb:has_titles syb:titles_iri(titles_tbl.title_id, titles_tbl.pub_id) where (^{titles_tbl.}^.title_id = ^{titleauthor_tbl.}^.title_id) as virtrdf:titleauthor_has_titles . syb:titles_iri (titles_tbl.title_id, titles_tbl.pub_id) a syb:titles as virtrdf:titles_pk; syb:title_id titles_tbl.title_id as virtrdf:titles_title_idd; syb:title titles_tbl.title as virtrdf:titles_title; syb:type titles_tbl.type as virtrdf:titles_type; syb:pub_id titles_tbl.pub_id as virtrdf:titles_pub_id; syb:price titles_tbl.price as virtrdf:titles_price; syb:advance titles_tbl.advance as virtrdf:titles_advance; syb:total_sales titles_tbl.total_sales as virtrdf:titles_total_sales; syb:notes titles_tbl.notes as virtrdf:titles_notes; syb:pubdate titles_tbl.pubdate as virtrdf:titles_pubdate; syb:contract titles_tbl.contract as virtrdf:titles_contract; syb:has_titleauthor syb:titleauthor_iri(titleauthor_tbl.au_id, titleauthor_tbl.title_id) where (^{titleauthor_tbl.}^.title_id = ^{titles_tbl.}^.title_id) as virtrdf:titles_has_titleauthor; syb:has_salesdetail syb:salesdetail_iri (salesdetail_tbl.stor_id, salesdetail_tbl.ord_num, salesdetail_tbl.title_id) where (^{salesdetail_tbl.}^.title_id = ^{titles_tbl.}^.title_id) as virtrdf:titles_has_salesdetail . } . } . ; delete from db.dba.url_rewrite_rule_list where urrl_list like 'sybasepubs2_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'sybasepubs2_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'sybasepubs2_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'sybasepubs2_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=DESCRIBE+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+FROM+%%3Chttp%%3A//localhost%%3A8890/sybasepubs2%%3E&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'sybasepubs2_rule_list1', 1, vector ( 'sybasepubs2_rule1', 'sybasepubs2_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/sybasepubs2'); VHOST_DEFINE ( lpath=>'/sybasepubs2', ppath=>'/DAV/sybasepubs2/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'sybasepubs2_rule_list1') ); delete from db.dba.url_rewrite_rule_list where urrl_list like 'sybase_schemas_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'sybase_schemas_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'sybase_schemas_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'sybase_schemas_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}%%0D%%0AFROM+%%3Chttp%%3A//localhost%%3A8890/schemas/sybasepubs2%%3E+%%0D%%0AWHERE+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path','path','*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'sybase_schemas_rule_list1', 1, vector ( 'sybase_schemas_rule1', 'sybase_schemas_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/schema/sybasepubs2'); VHOST_DEFINE ( lpath=>'/schemas/sybasepubs2', ppath=>'/DAV/schemas/sybasepubs2/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'sybase_schemas_rule_list1') ); DB.DBA.XML_SET_NS_DECL ('hr', 'http://^{URIQADefaultHost}^/schemas/sybasepubs2', 2);
use DB; DB.DBA.exec_no_error('UPDATE WS.WS.SYS_DAV_RES set RES_TYPE=\'image/jpeg\' where RES_FULL_PATH like \'/DAV/VAD/demo/sql/CAT%\'') ; DB.DBA.exec_no_error('UPDATE WS.WS.SYS_DAV_RES set RES_TYPE=\'image/jpeg\' where RES_FULL_PATH like \'/DAV/VAD/demo/sql/EMP%\'') ; GRANT SELECT ON "Demo"."demo"."Products" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Suppliers" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Shippers" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Categories" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Customers" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Employees" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Orders" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Order_Details" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Countries" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Provinces" TO "SPARQL"; SPARQL prefix tut_northwind: <http://demo.openlinksw.com/schemas/tutorial/northwind#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix owl: <http://www.w3.org/2002/07/owl#> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> drop quad map graph iri("http://^{URIQADefaultHost}^/tutorial/Northwind") . ; SPARQL prefix tut_northwind: <http://demo.openlinksw.com/schemas/tutorial/northwind#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix owl: <http://www.w3.org/2002/07/owl#> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> drop quad map virtrdf:TutorialNorthwindDemo . ; create function DB.DBA.TUT_NORTHWIND_ID_TO_IRI(in _prefix varchar,in _id varchar) { declare iri, uriqa_host any; uriqa_host := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); iri := 'http://' || uriqa_host || '/tutorial/Northwind/' || _prefix || '/' || _id || '#this'; return sprintf ('http://%s/DAV/VAD/tutorial/rdfview/rd_v_1/RDFData/All/iid%%20(%d).rdf', uriqa_host, iri_id_num (iri_to_id (iri))); } ; create function DB.DBA.TUT_NORTHWIND_IRI_TO_ID(in _iri varchar) { declare parts any; parts := sprintf_inverse (_iri, 'http://%s/DAV/VAD/tutorial/rdfview/rd_v_1/RDFData/All/iid (%d).rdf', 1 ); if (parts is not null) { declare uriqa_host, iri any; uriqa_host := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); if (parts[0] = uriqa_host) { iri := id_to_iri(iri_id_from_num(parts[1])); parts := sprintf_inverse (iri, 'http://%s/tutorial/Northwind/%s/%s#this', 1 ); if (parts[0] = uriqa_host) { return parts[2]; } } } return NULL; } ; create function DB.DBA.TUT_CATEGORY_IRI (in _id integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Category', cast(_id as varchar)); } ; create function DB.DBA.TUT_CATEGORY_IRI_INVERSE (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_SHIPPER_IRI (in _id integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Shipper', cast(_id as varchar)); } ; create function DB.DBA.TUT_SHIPPER_IRI_INVERSE (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_SUPPLIER_IRI (in _id integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Supplier', cast(_id as varchar)); } ; create function DB.DBA.TUT_SUPPLIER_IRI_INVERSE (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_PRODUCT_IRI (in _id integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Product', cast(_id as varchar)); } ; create function DB.DBA.TUT_PRODUCT_IRI_INVERSE (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_CUSTOMER_IRI (in _id varchar) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Customer', _id); } ; create function DB.DBA.TUT_CUSTOMER_IRI_INVERSE (in _iri varchar) returns varchar { return DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri); }; create function DB.DBA.TUT_EMPLOYEE_IRI (in _id integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Employee', cast(_id as varchar)); } ; create function DB.DBA.TUT_EMPLOYEE_IRI_INVERSE (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_ORDER_IRI (in _id integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Order', cast(_id as varchar)); } ; create function DB.DBA.TUT_ORDER_IRI_INVERSE (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_CUSTOMERCONTACT_IRI (in _id integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('CustomerContact', cast(_id as varchar)); } ; create function DB.DBA.TUT_CUSTOMERCONTACT_IRI_INVERSE (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_ORDERLINE_IRI (in _id1 integer, in _id2 integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('OrderLine', sprintf('%d/%d', _id1, _id2)); } ; create function DB.DBA.TUT_ORDERLINE_IRI_INV_1 (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_ORDERLINE_IRI_INV_2 (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_PROVINCE_IRI (in _id1 varchar, in _id2 varchar) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Province', sprintf('%s/%s', _id1, _id2)); } ; create function DB.DBA.TUT_PROVINCE_IRI_INV_1 (in _iri varchar) returns varchar { return DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri); }; create function DB.DBA.TUT_PROVINCE_IRI_INV_2 (in _iri varchar) returns varchar { return DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri); }; create function DB.DBA.TUT_COUNTRY_IRI (in _id varchar) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Country', _id); } ; create function DB.DBA.TUT_COUNTRY_IRI_INVERSE (in _iri varchar) returns varchar { return DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri); }; create function DB.DBA.TUT_FLAG_IRI (in _id varchar) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('Flag', _id); } ; create function DB.DBA.TUT_FLAG_IRI_INVERSE (in _iri varchar) returns varchar { return DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri); }; create function DB.DBA.TUT_EMPLOYEEPHOTO_IRI (in _id integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('EmployeePhoto', cast(_id as varchar)); } ; create function DB.DBA.TUT_EMPLOYEEPHOTO_IRI_INVERSE (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; create function DB.DBA.TUT_CATEGORYPHOTO_IRI (in _id integer) returns varchar { return TUT_NORTHWIND_ID_TO_IRI('CategoryPhoto', cast(_id as varchar)); } ; create function DB.DBA.TUT_CATEGORYPHOTO_IRI_INVERSE (in _iri varchar) returns integer { return atoi(DB.DBA.TUT_NORTHWIND_IRI_TO_ID(_iri)); }; grant execute on DB.DBA.TUT_CATEGORY_IRI to "SPARQL"; grant execute on DB.DBA.TUT_CATEGORY_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_SHIPPER_IRI to "SPARQL"; grant execute on DB.DBA.TUT_SHIPPER_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_SUPPLIER_IRI to "SPARQL"; grant execute on DB.DBA.TUT_SUPPLIER_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_PRODUCT_IRI to "SPARQL"; grant execute on DB.DBA.TUT_PRODUCT_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_CUSTOMER_IRI to "SPARQL"; grant execute on DB.DBA.TUT_CUSTOMER_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_EMPLOYEE_IRI to "SPARQL"; grant execute on DB.DBA.TUT_EMPLOYEE_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_ORDER_IRI to "SPARQL"; grant execute on DB.DBA.TUT_ORDER_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_CUSTOMERCONTACT_IRI to "SPARQL"; grant execute on DB.DBA.TUT_CUSTOMERCONTACT_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_ORDERLINE_IRI to "SPARQL"; grant execute on DB.DBA.TUT_ORDERLINE_IRI_INV_1 to "SPARQL"; grant execute on DB.DBA.TUT_ORDERLINE_IRI_INV_2 to "SPARQL"; grant execute on DB.DBA.TUT_PROVINCE_IRI to "SPARQL"; grant execute on DB.DBA.TUT_PROVINCE_IRI_INV_1 to "SPARQL"; grant execute on DB.DBA.TUT_PROVINCE_IRI_INV_2 to "SPARQL"; grant execute on DB.DBA.TUT_COUNTRY_IRI to "SPARQL"; grant execute on DB.DBA.TUT_COUNTRY_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_FLAG_IRI to "SPARQL"; grant execute on DB.DBA.TUT_FLAG_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_EMPLOYEEPHOTO_IRI to "SPARQL"; grant execute on DB.DBA.TUT_EMPLOYEEPHOTO_IRI_INVERSE to "SPARQL"; grant execute on DB.DBA.TUT_CATEGORYPHOTO_IRI to "SPARQL"; grant execute on DB.DBA.TUT_CATEGORYPHOTO_IRI_INVERSE to "SPARQL"; SPARQL prefix tut_northwind: <http://demo.openlinksw.com/schemas/tutorial/northwind#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix owl: <http://www.w3.org/2002/07/owl#> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> create iri class tut_northwind:Category "http://^{URIQADefaultHost}^/tutorial/Northwind/Category/%d#this" (in category_id integer not null) . create iri class tut_northwind:Shipper "http://^{URIQADefaultHost}^/tutorial/Northwind/Shipper/%d#this" (in shipper_id integer not null) . create iri class tut_northwind:Supplier "http://^{URIQADefaultHost}^/tutorial/Northwind/Supplier/%d#this" (in supplier_id integer not null) . create iri class tut_northwind:Product "http://^{URIQADefaultHost}^/tutorial/Northwind/Product/%d#this" (in product_id integer not null) . create iri class tut_northwind:Customer "http://^{URIQADefaultHost}^/tutorial/Northwind/Customer/%U#this" (in customer_id varchar not null) . create iri class tut_northwind:Employee "http://^{URIQADefaultHost}^/tutorial/Northwind/Employee/%U%U%d#this" (in employee_firstname varchar not null, in employee_lastname varchar not null, in employee_id integer not null) . create iri class tut_northwind:Order "http://^{URIQADefaultHost}^/tutorial/Northwind/Order/%d#this" (in order_id integer not null) . create iri class tut_northwind:CustomerContact "http://^{URIQADefaultHost}^/tutorial/Northwind/CustomerContact/%U#this" (in customer_id varchar not null) . create iri class tut_northwind:OrderLine "http://^{URIQADefaultHost}^/tutorial/Northwind/OrderLine/%d/%d#this" (in order_id integer not null, in product_id integer not null) . create iri class tut_northwind:Province "http://^{URIQADefaultHost}^/tutorial/Northwind/Province/%U/%U#this" (in country_name varchar not null, in province_name varchar not null) . create iri class tut_northwind:Country "http://^{URIQADefaultHost}^/tutorial/Northwind/Country/%U#this" (in country_name varchar not null) . create iri class tut_northwind:Flag "http://^{URIQADefaultHost}^%U#this" (in flag_path varchar not null) . create iri class tut_northwind:dbpedia_iri "http://dbpedia.org/resource/%U" (in uname varchar not null) . create iri class tut_northwind:EmployeePhoto "http://^{URIQADefaultHost}^/DAV/VAD/demo/sql/EMP%d#this" (in emp_id varchar not null) . create iri class tut_northwind:CategoryPhoto "http://^{URIQADefaultHost}^/DAV/VAD/demo/sql/CAT%d#this" (in category_id varchar not null) . ; SPARQL prefix tut_northwind: <http://demo.openlinksw.com/schemas/tutorial/northwind#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix owl: <http://www.w3.org/2002/07/owl#> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> create iri class tut_northwind:customercontact_iri using function DB.DBA.TUT_CUSTOMERCONTACT_IRI (in customer_id varchar) returns varchar, function DB.DBA.TUT_CUSTOMERCONTACT_IRI_INVERSE (in customer_iri varchar) returns varchar. create iri class tut_northwind:category_iri using function DB.DBA.TUT_CATEGORY_IRI (in customer_id integer) returns varchar, function DB.DBA.TUT_CATEGORY_IRI_INVERSE (in customer_iri varchar) returns integer. create iri class tut_northwind:shipper_iri using function DB.DBA.TUT_SHIPPER_IRI (in customer_id integer) returns varchar, function DB.DBA.TUT_SHIPPER_IRI_INVERSE (in customer_iri varchar) returns integer. create iri class tut_northwind:supplier_iri using function DB.DBA.TUT_SUPPLIER_IRI (in customer_id varchar) returns varchar, function DB.DBA.TUT_SUPPLIER_IRI_INVERSE (in customer_iri varchar) returns varchar. create iri class tut_northwind:product_iri using function DB.DBA.TUT_PRODUCT_IRI (in customer_id integer) returns varchar, function DB.DBA.TUT_PRODUCT_IRI_INVERSE (in customer_iri varchar) returns integer. create iri class tut_northwind:customer_iri using function DB.DBA.TUT_CUSTOMER_IRI (in customer_id varchar) returns varchar, function DB.DBA.TUT_CUSTOMER_IRI_INVERSE (in customer_iri varchar) returns varchar. create iri class tut_northwind:employee_iri using function DB.DBA.TUT_EMPLOYEE_IRI (in customer_id integer) returns varchar, function DB.DBA.TUT_EMPLOYEE_IRI_INVERSE (in customer_iri varchar) returns integer. create iri class tut_northwind:order_iri using function DB.DBA.TUT_ORDER_IRI (in customer_id integer) returns varchar, function DB.DBA.TUT_ORDER_IRI_INVERSE (in customer_iri varchar) returns integer. create iri class tut_northwind:orderline_iri using function DB.DBA.TUT_ORDERLINE_IRI (in customer_id integer, in customer_id2 integer) returns varchar, function DB.DBA.TUT_ORDERLINE_IRI_INV_1 (in customer_iri varchar) returns integer, function DB.DBA.TUT_ORDERLINE_IRI_INV_2 (in customer_iri varchar) returns integer. create iri class tut_northwind:province_iri using function DB.DBA.TUT_PROVINCE_IRI (in customer_id varchar, in customer_id2 varchar) returns varchar, function DB.DBA.TUT_PROVINCE_IRI_INV_1 (in customer_iri varchar) returns varchar, function DB.DBA.TUT_PROVINCE_IRI_INV_2 (in customer_iri varchar) returns varchar. create iri class tut_northwind:country_iri using function DB.DBA.TUT_COUNTRY_IRI (in customer_id varchar) returns varchar, function DB.DBA.TUT_COUNTRY_IRI_INVERSE (in customer_iri varchar) returns varchar. create iri class tut_northwind:employeephoto_iri using function DB.DBA.TUT_EMPLOYEEPHOTO_IRI (in customer_id integer) returns varchar, function DB.DBA.TUT_EMPLOYEEPHOTO_IRI_INVERSE (in customer_iri varchar) returns integer. create iri class tut_northwind:categoryphoto_iri using function DB.DBA.TUT_CATEGORYPHOTO_IRI (in customer_id integer) returns varchar, function DB.DBA.TUT_CATEGORYPHOTO_IRI_INVERSE (in customer_iri varchar) returns integer. create iri class tut_northwind:flag_iri using function DB.DBA.TUT_FLAG_IRI (in customer_id varchar) returns varchar, function DB.DBA.TUT_FLAG_IRI_INVERSE (in customer_iri varchar) returns varchar. ; SPARQL prefix tut_northwind: <http://demo.openlinksw.com/schemas/tutorial/northwind#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix owl: <http://www.w3.org/2002/07/owl#> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> alter quad storage virtrdf:DefaultQuadStorage from Demo.demo.Products as products from Demo.demo.Suppliers as suppliers from Demo.demo.Shippers as shippers from Demo.demo.Categories as categories from Demo.demo.Customers as customers from Demo.demo.Employees as employees from Demo.demo.Orders as orders from Demo.demo.Order_Details as order_lines from Demo.demo.Countries as countries from Demo.demo.Provinces as provinces where (^{suppliers.}^.Country = ^{countries.}^.Name) where (^{customers.}^.Country = ^{countries.}^.Name) where (^{employees.}^.Country = ^{countries.}^.Name) where (^{orders.}^.ShipCountry = ^{countries.}^.Name) { create virtrdf:TutorialNorthwindDemo as graph iri ("http://^{URIQADefaultHost}^/tutorial/Northwind") option (exclusive) { tut_northwind:CustomerContact (customers.CustomerID) a foaf:Person as virtrdf:tutCustomerContact-foaf_Person . tut_northwind:CustomerContact (customers.CustomerID) a tut_northwind:CustomerContact as virtrdf:tutCustomerContact-CustomerContact; foaf:name customers.ContactName as virtrdf:tutCustomerContact-contact_name ; foaf:phone customers.Phone as virtrdf:tutCustomerContact-foaf_phone ; tut_northwind:is_contact_at tut_northwind:Customer (customers.CustomerID) as virtrdf:tutCustomerContact-is_contact_at ; tut_northwind:country tut_northwind:Country (customers.Country) as virtrdf:tutCustomerContact-country ; rdfs:isDefinedBy tut_northwind:customercontact_iri (customers.CustomerID) ; rdfs:isDefinedBy tut_northwind:CustomerContact (customers.CustomerID) . tut_northwind:Country (customers.Country) tut_northwind:is_country_of tut_northwind:CustomerContact (customers.CustomerID) as virtrdf:tutCustomerContact-is_country_of . tut_northwind:Product (products.ProductID) a tut_northwind:Product as virtrdf:tutProduct-ProductID ; tut_northwind:has_category tut_northwind:Category (products.CategoryID) as virtrdf:tutProduct-product_has_category ; tut_northwind:has_supplier tut_northwind:Supplier (products.SupplierID) as virtrdf:tutProduct-product_has_supplier ; tut_northwind:productName products.ProductName as virtrdf:tutProduct-name_of_product ; tut_northwind:quantityPerUnit products.QuantityPerUnit as virtrdf:tutProduct-quantity_per_unit ; tut_northwind:unitPrice products.UnitPrice as virtrdf:tutProduct-unit_price ; tut_northwind:unitsInStock products.UnitsInStock as virtrdf:tutProduct-units_in_stock ; tut_northwind:unitsOnOrder products.UnitsOnOrder as virtrdf:tutProduct-units_on_order ; tut_northwind:reorderLevel products.ReorderLevel as virtrdf:tutProduct-reorder_level ; tut_northwind:discontinued products.Discontinued as virtrdf:tutProduct-discontinued ; rdfs:isDefinedBy tut_northwind:product_iri (products.ProductID) ; rdfs:isDefinedBy tut_northwind:Product (products.ProductID). tut_northwind:Category (products.CategoryID) tut_northwind:category_of tut_northwind:Product (products.ProductID) as virtrdf:tutProduct-category_of . tut_northwind:Supplier (products.SupplierID) tut_northwind:supplier_of tut_northwind:Product (products.ProductID) as virtrdf:tutProduct-supplier_of . tut_northwind:Supplier (suppliers.SupplierID) a tut_northwind:Supplier as virtrdf:tutSupplier-SupplierID ; tut_northwind:companyName suppliers.CompanyName as virtrdf:tutSupplier-company_name ; tut_northwind:contactName suppliers.ContactName as virtrdf:tutSupplier-contact_name ; tut_northwind:contactTitle suppliers.ContactTitle as virtrdf:tutSupplier-contact_title ; tut_northwind:address suppliers.Address as virtrdf:tutSupplier-address ; tut_northwind:city suppliers.City as virtrdf:tutSupplier-city ; tut_northwind:dbpedia_city tut_northwind:dbpedia_iri(suppliers.City) as virtrdf:tutSupplier-dbpedia_city ; tut_northwind:region suppliers.Region as virtrdf:tutSupplier-region ; tut_northwind:postalCode suppliers.PostalCode as virtrdf:tutSupplier-postal_code ; tut_northwind:country tut_northwind:Country(suppliers.Country) as virtrdf:tutSupplier-country ; tut_northwind:phone suppliers.Phone as virtrdf:tutSupplier-phone ; tut_northwind:fax suppliers.Fax as virtrdf:tutSupplier-fax ; tut_northwind:homePage suppliers.HomePage as virtrdf:tutSupplier-home_page ; rdfs:isDefinedBy tut_northwind:supplier_iri (suppliers.SupplierID) ; rdfs:isDefinedBy tut_northwind:Supplier (suppliers.SupplierID). tut_northwind:Country (suppliers.Country) tut_northwind:is_country_of tut_northwind:Supplier (suppliers.SupplierID) as virtrdf:tutSupplier-is_country_of . tut_northwind:Category (categories.CategoryID) a tut_northwind:Category as virtrdf:tutCategory-CategoryID ; tut_northwind:categoryName categories.CategoryName as virtrdf:tutCategory-home_page ; tut_northwind:description categories.Description as virtrdf:tutCategory-description ; foaf:img tut_northwind:CategoryPhoto(categories.CategoryID) as virtrdf:tutCategory-categories.CategoryPhoto ; rdfs:isDefinedBy tut_northwind:category_iri (categories.CategoryID) ; rdfs:isDefinedBy tut_northwind:Category (categories.CategoryID). tut_northwind:CategoryPhoto(categories.CategoryID) a tut_northwind:CategoryPhoto as virtrdf:tutCategory-categories.CategoryPhotoID ; rdfs:isDefinedBy tut_northwind:categoryphoto_iri (categories.CategoryID) ; rdfs:isDefinedBy tut_northwind:CategoryPhoto(categories.CategoryID). tut_northwind:Shipper (shippers.ShipperID) a tut_northwind:Shipper as virtrdf:tutShipper-ShipperID ; tut_northwind:companyName shippers.CompanyName as virtrdf:tutShipper-company_name ; tut_northwind:phone shippers.Phone as virtrdf:tutShipper-phone ; rdfs:isDefinedBy tut_northwind:shipper_iri (shippers.ShipperID) ; rdfs:isDefinedBy tut_northwind:Shipper (shippers.ShipperID). tut_northwind:Customer (customers.CustomerID) a tut_northwind:Customer as virtrdf:tutCustomer-CustomerID2 ; a foaf:Organization as virtrdf:tutCustomer-CustomerID ; foaf:name customers.CompanyName as virtrdf:tutCustomer-foaf_name ; tut_northwind:companyName customers.CompanyName as virtrdf:tutCustomer-company_name ; tut_northwind:has_contact tut_northwind:CustomerContact (customers.CustomerID) as virtrdf:tutCustomer-contact ; tut_northwind:country tut_northwind:Country (customers.Country) as virtrdf:tutCustomer-country ; tut_northwind:contactName customers.ContactName as virtrdf:tutCustomer-contact_name ; tut_northwind:contactTitle customers.ContactTitle as virtrdf:tutCustomer-contact_title ; tut_northwind:address customers.Address as virtrdf:tutCustomer-address ; tut_northwind:city customers.City as virtrdf:tutCustomer-city ; tut_northwind:dbpedia_city tut_northwind:dbpedia_iri(customers.City) as virtrdf:tutCustomer-dbpedia_city ; tut_northwind:region customers.Region as virtrdf:tutCustomer-region ; tut_northwind:PostalCode customers.PostalCode as virtrdf:tutCustomer-postal_code ; foaf:phone customers.Phone as virtrdf:tutCustomer-foaf_phone ; tut_northwind:phone customers.Phone as virtrdf:tutCustomer-phone ; tut_northwind:fax customers.Fax as virtrdf:tutCustomer-fax ; rdfs:isDefinedBy tut_northwind:customer_iri (customers.CustomerID) ; rdfs:isDefinedBy tut_northwind:Customer (customers.CustomerID). tut_northwind:Country (customers.Country) tut_northwind:is_country_of tut_northwind:Customer (customers.CustomerID) as virtrdf:tutCustomer-is_country_of . tut_northwind:Employee (employees.FirstName, employees.LastName, employees.EmployeeID) a tut_northwind:Employee as virtrdf:tutEmployee-EmployeeID2 ; a foaf:Person as virtrdf:tutEmployee-EmployeeID ; foaf:surname employees.LastName as virtrdf:tutEmployee-foaf_last_name ; tut_northwind:lastName employees.LastName as virtrdf:tutEmployee-last_name ; foaf:firstName employees.FirstName as virtrdf:tutEmployee-foaf_first_name ; tut_northwind:firstName employees.FirstName as virtrdf:tutEmployee-first_name ; foaf:title employees.Title as virtrdf:tutEmployee-title ; tut_northwind:titleOfCourtesy employees.TitleOfCourtesy as virtrdf:tutEmployee-title_of_courtesy ; foaf:birthday employees.BirthDate as virtrdf:tutEmployee-foaf_birth_date ; tut_northwind:birthday employees.BirthDate as virtrdf:tutEmployee-birth_date ; tut_northwind:hireDate employees.HireDate as virtrdf:tutEmployee-hire_date ; tut_northwind:address employees.Address as virtrdf:tutEmployee-address ; tut_northwind:city employees.City as virtrdf:tutEmployee-city ; tut_northwind:dbpedia_city tut_northwind:dbpedia_iri(employees.City) as virtrdf:tutEmployee-dbpedia_city ; tut_northwind:region employees.Region as virtrdf:tutEmployee-region ; tut_northwind:postalCode employees.PostalCode as virtrdf:tutEmployee-postal_code ; tut_northwind:country tut_northwind:Country (employees.Country) as virtrdf:tutEmployee-country ; foaf:phone employees.HomePhone as virtrdf:tutEmployee-home_phone ; tut_northwind:extension employees.Extension as virtrdf:tutEmployee-extension ; tut_northwind:notes employees.Notes as virtrdf:tutEmployee-notes ; tut_northwind:reportsTo tut_northwind:Employee(employees.FirstName, employees.LastName, employees.ReportsTo) where (^{employees.}^.ReportsTo = ^{employees.}^.EmployeeID) as virtrdf:tutEmployee-reports_to ; foaf:img tut_northwind:EmployeePhoto(employees.EmployeeID) as virtrdf:tutEmployee-employees.EmployeePhoto ; rdfs:isDefinedBy tut_northwind:employee_iri (employees.EmployeeID) ; rdfs:isDefinedBy tut_northwind:Employee (employees.FirstName, employees.LastName, employees.EmployeeID). tut_northwind:EmployeePhoto(employees.EmployeeID) a tut_northwind:EmployeePhoto as virtrdf:tut_Employee-employees.EmployeePhotoId ; rdfs:isDefinedBy tut_northwind:employeephoto_iri (employees.EmployeeID) ; rdfs:isDefinedBy tut_northwind:EmployeePhoto (employees.EmployeeID). tut_northwind:Employee (employees.FirstName, employees.LastName, orders.EmployeeID) tut_northwind:is_salesrep_of tut_northwind:Order (orders.OrderID) where (^{orders.}^.EmployeeID = ^{employees.}^.EmployeeID) as virtrdf:tutOrder-is_salesrep_of . tut_northwind:Country (employees.Country) tut_northwind:is_country_of tut_northwind:Employee (employees.FirstName, employees.LastName, employees.EmployeeID) as virtrdf:tutEmployee-is_country_of . tut_northwind:Order (orders.OrderID) a tut_northwind:Order as virtrdf:tutOrder-Order ; tut_northwind:has_customer tut_northwind:Customer (orders.CustomerID) as virtrdf:tutOrder-order_has_customer ; tut_northwind:has_salesrep tut_northwind:Employee (employees.FirstName, employees.LastName, orders.EmployeeID) where (^{orders.}^.EmployeeID = ^{employees.}^.EmployeeID) as virtrdf:tutCustomer-has_salesrep ; tut_northwind:has_employee tut_northwind:Employee (employees.FirstName, employees.LastName, orders.EmployeeID) where (^{orders.}^.EmployeeID = ^{employees.}^.EmployeeID) as virtrdf:tutOrder-order_has_employee ; tut_northwind:orderDate orders.OrderDate as virtrdf:tutOrder-order_date ; tut_northwind:requiredDate orders.RequiredDate as virtrdf:tutOrder-required_date ; tut_northwind:shippedDate orders.ShippedDate as virtrdf:tutOrder-shipped_date ; tut_northwind:order_ship_via tut_northwind:Shipper (orders.ShipVia) as virtrdf:tutOrder-order_ship_via ; tut_northwind:freight orders.Freight as virtrdf:tutOrder-freight ; tut_northwind:shipName orders.ShipName as virtrdf:tutOrder-ship_name ; tut_northwind:shipAddress orders.ShipAddress as virtrdf:tutOrder-ship_address ; tut_northwind:shipCity orders.ShipCity as virtrdf:tutOrder-ship_city ; tut_northwind:dbpedia_shipCity tut_northwind:dbpedia_iri(orders.ShipCity) as virtrdf:tutOrder-ship_dbpedia_city ; tut_northwind:shipRegion orders.ShipRegion as virtrdf:tutOrder-ship_region ; tut_northwind:shipPostal_code orders.ShipPostalCode as virtrdf:tutOrder-ship_postal_code ; tut_northwind:shipCountry tut_northwind:Country(orders.ShipCountry) as virtrdf:tutship_country ; rdfs:isDefinedBy tut_northwind:order_iri (orders.OrderID) ; rdfs:isDefinedBy tut_northwind:Order (orders.OrderID). tut_northwind:Country (orders.ShipCountry) tut_northwind:is_ship_country_of tut_northwind:Order (orders.OrderID) as virtrdf:tutOrder-is_country_of . tut_northwind:Customer (orders.CustomerID) tut_northwind:has_order tut_northwind:Order (orders.OrderID) as virtrdf:tutOrder-has_order . tut_northwind:Shipper (orders.ShipVia) tut_northwind:ship_order tut_northwind:Order (orders.OrderID) as virtrdf:tutOrder-ship_order . tut_northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) a tut_northwind:OrderLine as virtrdf:tutOrderLine-OrderLines ; tut_northwind:has_order_id tut_northwind:Order (order_lines.OrderID) as virtrdf:tutorder_lines_has_order_id ; tut_northwind:has_product_id tut_northwind:Product (order_lines.ProductID) as virtrdf:tutorder_lines_has_product_id ; tut_northwind:unitPrice order_lines.UnitPrice as virtrdf:tutOrderLine-unit_price ; tut_northwind:quantity order_lines.Quantity as virtrdf:tutOrderLine-quantity ; tut_northwind:discount order_lines.Discount as virtrdf:tutOrderLine-discount ; rdfs:isDefinedBy tut_northwind:orderline_iri (order_lines.OrderID, order_lines.ProductID) ; rdfs:isDefinedBy tut_northwind:OrderLine (order_lines.OrderID, order_lines.ProductID). tut_northwind:Order (orders.OrderID) tut_northwind:is_order_of tut_northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) where (^{orders.}^.OrderID = ^{order_lines.}^.OrderID) as virtrdf:tutOrder-is_order_of . tut_northwind:Product (products.ProductID) tut_northwind:is_product_of tut_northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) where (^{products.}^.ProductID = ^{order_lines.}^.ProductID) as virtrdf:tutProduct-is_product_of . tut_northwind:Country (countries.Name) a tut_northwind:Country as virtrdf:tutCountry-Type2 ; a wgs:SpatialThing as virtrdf:tutCountry-Type ; owl:sameAs tut_northwind:dbpedia_iri (countries.Name) ; tut_northwind:name countries.Name as virtrdf:tutCountry-Name ; tut_northwind:code countries.Code as virtrdf:tutCountry-Code ; tut_northwind:smallFlagDAVResourceName countries.SmallFlagDAVResourceName as virtrdf:tutCountry-SmallFlagDAVResourceName ; tut_northwind:largeFlagDAVResourceName countries.LargeFlagDAVResourceName as virtrdf:tutCountry-LargeFlagDAVResourceName ; tut_northwind:smallFlagDAVResourceURI tut_northwind:Flag(countries.SmallFlagDAVResourceURI) as virtrdf:tutCountry-SmallFlagDAVResourceURI ; tut_northwind:largeFlagDAVResourceURI tut_northwind:Flag(countries.LargeFlagDAVResourceURI) as virtrdf:tutCountry-LargeFlagDAVResourceURI ; wgs:lat countries.Lat as virtrdf:tutCountry-Lat ; wgs:long countries.Lng as virtrdf:tutCountry-Lng ; rdfs:isDefinedBy tut_northwind:country_iri (countries.Name) ; rdfs:isDefinedBy tut_northwind:Country (countries.Name). tut_northwind:Country (countries.Name) tut_northwind:has_province tut_northwind:Province (provinces.CountryCode, provinces.Province) where (^{provinces.}^.CountryCode = ^{countries.}^.Code) as virtrdf:tutCountry-has_province . tut_northwind:Province (provinces.CountryCode, provinces.Province) a tut_northwind:Province as virtrdf:tutProvince-Provinces ; tut_northwind:has_country_code provinces.CountryCode as virtrdf:tuthas_country_code ; tut_northwind:provinceName provinces.Province as virtrdf:tutProvince-ProvinceName ; rdfs:isDefinedBy tut_northwind:province_iri (provinces.CountryCode, provinces.Province) ; rdfs:isDefinedBy tut_northwind:Province (provinces.CountryCode, provinces.Province). tut_northwind:Province (provinces.CountryCode, provinces.Province) tut_northwind:is_province_of tut_northwind:Country (countries.Name) where (^{countries.}^.Code = ^{provinces.}^.CountryCode) as virtrdf:tutProvince-country_of . } . } . ; DELETE FROM db.dba.url_rewrite_rule_list where urrl_list like 'tut_nw%'; DELETE FROM db.dba.url_rewrite_rule where urr_rule like 'tut_nw%'; create procedure DB.DBA.install_run () { declare file_text, uriqa varchar; uriqa := registry_get('URIQADefaultHost'); file_text := (SELECT blob_to_string (RES_CONTENT) FROM WS.WS.SYS_DAV_RES where RES_FULL_PATH='/DAV/VAD/tutorial/rdfview/rd_v_1/rd_v_1.isparql'); file_text := replace(file_text, 'URIQA_MACRO', concat('http://', uriqa, '/tutorial/Northwind')); update WS.WS.SYS_DAV_RES set RES_CONTENT=file_text where RES_FULL_PATH='/DAV/VAD/tutorial/rdfview/rd_v_1/rd_v_1.isparql'; } ; DB.DBA.install_run() ; drop procedure DB.DBA.install_run ; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tut_nw_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%23this%%3E+%%3Fp+%%3Fo+}+FROM+%%3Chttp%%3A//^{URIQADefaultHost}^/tutorial/Northwind%%3E+WHERE+{+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%23this%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tut_nw_rule1', 1, '(/[^#]*)', vector('path'), 1, '/rdfbrowser/index.html?uri=http%%3A//^{URIQADefaultHost}^%U%%23this', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'tut_nw_rule3', 1, '(/[^#]*)/\x24', vector('path'), 1, '%s', vector('path'), null, null, 0, null ); create procedure DB.DBA.REMOVE_TUT_DEMO_RDF_DET() { declare colid int; colid := DAV_SEARCH_ID('/DAV/VAD/tutorial/rdfview/rd_v_1/', 'C'); if (colid < 0) return; update WS.WS.SYS_DAV_COL set COL_DET=null where COL_ID = colid; } ; DB.DBA.REMOVE_TUT_DEMO_RDF_DET(); drop procedure DB.DBA.REMOVE_TUT_DEMO_RDF_DET; create procedure DB.DBA.TUT_NORTHWIND_MAKE_RDF_DET() { declare uriqa_str varchar; uriqa_str := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); uriqa_str := 'http://' || uriqa_str || '/tutorial/Northwind'; DB.DBA."RDFData_MAKE_DET_COL" ('/DAV/VAD/tutorial/rdfview/rd_v_1/RDFData/', uriqa_str, NULL); VHOST_REMOVE (lpath=>'/tutorial/Northwind/data/rdf'); DB.DBA.VHOST_DEFINE (lpath=>'/tutorial/Northwind/data/rdf', ppath=>'/DAV/VAD/tutorial/rdfview/rd_v_1/RDFData/All/', is_dav=>1, vsp_user=>'dba'); } ; DB.DBA.TUT_NORTHWIND_MAKE_RDF_DET(); drop procedure DB.DBA.TUT_NORTHWIND_MAKE_RDF_DET; -- procedure to convert path to DET resource name create procedure DB.DBA.TUT_NORTHWIND_DET_REF (in par varchar, in fmt varchar, in val varchar) { declare res, iri any; declare uriqa_str varchar; uriqa_str := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); uriqa_str := 'http://' || uriqa_str || '/tutorial/Northwind'; iri := uriqa_str || val; res := sprintf ('iid (%d).rdf', iri_id_num (iri_to_id (iri))); return sprintf (fmt, res); } ; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('tut_nw_rdf', 1, '/tutorial/Northwind/(.*)', vector('path'), 1, '/tutorial/Northwind/data/rdf/%U', vector('path'), 'DB.DBA.TUT_NORTHWIND_DET_REF', 'application/rdf.xml', 2, 303); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'tut_nw_rule_list1', 1, vector ( 'tut_nw_rule1', 'tut_nw_rule2', 'tut_nw_rule3', 'tut_nw_rdf' )); VHOST_REMOVE (lpath=>'/tutorial/Northwind'); DB.DBA.VHOST_DEFINE (lpath=>'/tutorial/Northwind', ppath=>'/DAV/VAD/tutorial/rdfview/rd_v_1/', vsp_user=>'dba', is_dav=>1, def_page=>'sfront.vspx', is_brws=>0, opts=>vector ('url_rewrite', 'tut_nw_rule_list1')); create procedure DB.DBA.LOAD_TUTNW_ONTOLOGY_FROM_DAV() { declare content, urihost varchar; whenever not found goto endpoint; SELECT cast (RES_CONTENT as varchar) into content FROM WS.WS.SYS_DAV_RES where RES_FULL_PATH = '/DAV/VAD/tutorial/rdfview/rd_v_1/rd_v_1.owl'; if (content is null or content = '') goto endpoint; DB.DBA.RDF_LOAD_RDFXML (content, 'http://demo.openlinksw.com/schemas/tutorial/northwind#', 'http://demo.openlinksw.com/schemas/TutorialNorthwindOntology/1.0/'); if (urihost = 'demo.openlinksw.com') { DB.DBA.VHOST_REMOVE (lpath=>'/schemas/tutorial/northwind#'); DB.DBA.VHOST_DEFINE (lpath=>'/schemas/tutorial/northwind#', ppath=>'/DAV/VAD/tutorial/rdfview/rd_v_1/rd_v_1.owl', vsp_user=>'dba', is_dav=>1, is_brws=>0); DB.DBA.VHOST_REMOVE (lpath=>'/schemas/tutorial/northwind'); DB.DBA.VHOST_DEFINE (lpath=>'/schemas/tutorial/northwind', ppath=>'/DAV/VAD/tutorial/rdfview/rd_v_1/rd_v_1.owl', vsp_user=>'dba', is_dav=>1, is_brws=>0); } endpoint: ; } ; DB.DBA.LOAD_TUTNW_ONTOLOGY_FROM_DAV() ; drop procedure DB.DBA.LOAD_TUTNW_ONTOLOGY_FROM_DAV ; create procedure DB.DBA.LOAD_TUTNW_ONTOLOGY_FROM_DAV2() { declare urihost varchar; sparql base <http://demo.openlinksw.com/schemas/tutorial/northwind#> load bif:concat ("http://", bif:registry_get("URIQADefaultHost"), "/DAV/VAD/tutorial/rdfview/rd_v_1/rd_v_1.owl") into graph <http://demo.openlinksw.com/schemas/TutorialNorthwindOntology/1.0/>; urihost := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); if (urihost = 'demo.openlinksw.com') { DB.DBA.VHOST_REMOVE (lpath=>'/tutorial/northwind#'); DB.DBA.VHOST_DEFINE (lpath=>'/tutorial/northwind#', ppath=>'/DAV/VAD/tutorial/rdfview/rd_v_1/rd_v_1.owl', vsp_user=>'dba', is_dav=>1, is_brws=>0); } } ; --DB.DBA.LOAD_TUTNW_ONTOLOGY_FROM_DAV2(); drop procedure DB.DBA.LOAD_TUTNW_ONTOLOGY_FROM_DAV2 ; DB.DBA.XML_SET_NS_DECL ('tut_northwind', 'http://demo.openlinksw.com/schemas/tutorial/northwind#', 2);
use DB; DB.DBA.exec_stmt ('UPDATE WS.WS.SYS_DAV_RES set RES_TYPE=\'image/jpeg\' where RES_FULL_PATH like \'/DAV/VAD/demo/sql/CAT%\'', 0) ; DB.DBA.exec_stmt ('UPDATE WS.WS.SYS_DAV_RES set RES_TYPE=\'image/jpeg\' where RES_FULL_PATH like \'/DAV/VAD/demo/sql/EMP%\'', 0) ; GRANT SELECT ON "Demo"."demo"."Products" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Suppliers" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Shippers" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Categories" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Customers" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Employees" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Orders" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Order_Details" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Countries" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Provinces" TO "SPARQL"; SPARQL drop quad map graph iri("http://^{URIQADefaultHost}^/Northwind") . ; SPARQL drop quad map virtrdf:NorthwindDemo . ; SPARQL prefix northwind: <http://demo.openlinksw.com/schemas/northwind#> drop iri class northwind:Category . drop iri class northwind:CategoryDoc . drop iri class northwind:Shipper . drop iri class northwind:ShipperDoc . drop iri class northwind:Supplier . drop iri class northwind:SupplierDoc . drop iri class northwind:Product . drop iri class northwind:ProductDoc . drop iri class northwind:Customer . drop iri class northwind:CustomerDoc . drop iri class northwind:Employee . drop iri class northwind:EmployeeDoc . drop iri class northwind:Order . drop iri class northwind:OrderDoc . drop iri class northwind:CustomerContact . drop iri class northwind:CustomerContactDoc . drop iri class northwind:OrderLine . drop iri class northwind:OrderLineDoc . drop iri class northwind:Province . drop iri class northwind:ProvinceDoc . drop iri class northwind:Country . drop iri class northwind:CountryDoc . drop iri class northwind:Flag . drop iri class northwind:FlagDoc . drop iri class northwind:dbpedia_iri2 . drop iri class northwind:EmployeePhoto . drop iri class northwind:CategoryPhoto . drop iri class northwind:category_iri . drop iri class northwind:categorydoc_iri . drop iri class northwind:shipper_iri . drop iri class northwind:shipperdoc_iri . drop iri class northwind:supplier_iri . drop iri class northwind:supplierdoc_iri . drop iri class northwind:product_iri . drop iri class northwind:productdoc_iri . drop iri class northwind:customer_iri . drop iri class northwind:customerdoc_iri . drop iri class northwind:employee_iri . drop iri class northwind:employeedoc_iri . drop iri class northwind:order_iri . drop iri class northwind:orderdoc_iri . drop iri class northwind:customercontact_iri . drop iri class northwind:customercontactdoc_iri . drop iri class northwind:orderline_iri . drop iri class northwind:orderlinedoc_iri . drop iri class northwind:province_iri . drop iri class northwind:provincedoc_iri . drop iri class northwind:country_iri . drop iri class northwind:countrydoc_iri . drop iri class northwind:employeephoto_iri . drop iri class northwind:categoryphoto_iri . drop iri class northwind:flag_iri . drop iri class northwind:flagdoc_iri . ; SPARQL prefix northwind: <http://demo.openlinksw.com/schemas/northwind#> create iri class northwind:Category "http://^{URIQADefaultHost}^/Northwind/Category/%d#this" (in category_id integer not null) . create iri class northwind:CategoryDoc "http://^{URIQADefaultHost}^/Northwind/Category/%d" (in category_id integer not null) . create iri class northwind:Shipper "http://^{URIQADefaultHost}^/Northwind/Shipper/%d#this" (in shipper_id integer not null) . create iri class northwind:ShipperDoc "http://^{URIQADefaultHost}^/Northwind/Shipper/%d" (in shipper_id integer not null) . create iri class northwind:Supplier "http://^{URIQADefaultHost}^/Northwind/Supplier/%d#this" (in supplier_id integer not null) . create iri class northwind:SupplierDoc "http://^{URIQADefaultHost}^/Northwind/Supplier/%d" (in supplier_id integer not null) . create iri class northwind:Product "http://^{URIQADefaultHost}^/Northwind/Product/%d#this" (in product_id integer not null) . create iri class northwind:ProductDoc "http://^{URIQADefaultHost}^/Northwind/Product/%d" (in product_id integer not null) . create iri class northwind:Customer "http://^{URIQADefaultHost}^/Northwind/Customer/%U#this" (in customer_id varchar not null) . create iri class northwind:CustomerDoc "http://^{URIQADefaultHost}^/Northwind/Customer/%U" (in customer_id varchar not null) . create iri class northwind:Employee "http://^{URIQADefaultHost}^/Northwind/Employee/%U_%U_%d#this" (in employee_firstname varchar not null, in employee_lastname varchar not null, in employee_id integer not null) . create iri class northwind:EmployeeDoc "http://^{URIQADefaultHost}^/Northwind/Employee/%U_%U_%d" (in employee_firstname varchar not null, in employee_lastname varchar not null, in employee_id integer not null) . create iri class northwind:Order "http://^{URIQADefaultHost}^/Northwind/Order/%d#this" (in order_id integer not null) . create iri class northwind:OrderDoc "http://^{URIQADefaultHost}^/Northwind/Order/%d" (in order_id integer not null) . create iri class northwind:CustomerContact "http://^{URIQADefaultHost}^/Northwind/CustomerContact/%U#this" (in customer_id varchar not null) . create iri class northwind:CustomerContactDoc "http://^{URIQADefaultHost}^/Northwind/CustomerContact/%U" (in customer_id varchar not null) . create iri class northwind:OrderLine "http://^{URIQADefaultHost}^/Northwind/OrderLine/%d/%d#this" (in order_id integer not null, in product_id integer not null) . create iri class northwind:OrderLineDoc "http://^{URIQADefaultHost}^/Northwind/OrderLine/%d/%d" (in order_id integer not null, in product_id integer not null) . create iri class northwind:Province "http://^{URIQADefaultHost}^/Northwind/Province/%U/%U#this" (in country_name varchar not null, in province_name varchar not null) . create iri class northwind:ProvinceDoc "http://^{URIQADefaultHost}^/Northwind/Province/%U/%U" (in country_name varchar not null, in province_name varchar not null) . create iri class northwind:Country "http://^{URIQADefaultHost}^/Northwind/Country/%U#this" (in country_name varchar not null) . create iri class northwind:CountryDoc "http://^{URIQADefaultHost}^/Northwind/Country/%U" (in country_name varchar not null) . create iri class northwind:Flag "http://^{URIQADefaultHost}^%U#this" (in flag_path varchar not null) . create iri class northwind:FlagDoc "http://^{URIQADefaultHost}^%U" (in flag_path varchar not null) . create iri class northwind:dbpedia_iri2 "http://dbpedia.org/resource/%U" (in uname varchar not null) . create iri class northwind:EmployeePhoto "http://^{URIQADefaultHost}^/DAV/VAD/demo/sql/EMP%d#this" (in emp_id varchar not null) . create iri class northwind:CategoryPhoto "http://^{URIQADefaultHost}^/DAV/VAD/demo/sql/CAT%d#this" (in category_id varchar not null) . create iri class northwind:Phone "tel:%s" (in phone_number varchar) . create iri class northwind:Fax "fax:%s" (in fax_number varchar) . ; SPARQL prefix northwind: <http://demo.openlinksw.com/schemas/northwind#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix owl: <http://www.w3.org/2002/07/owl#> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> alter quad storage virtrdf:DefaultQuadStorage FROM Demo.demo.Products as products FROM Demo.demo.Suppliers as suppliers FROM Demo.demo.Shippers as shippers FROM Demo.demo.Categories as categories FROM Demo.demo.Customers as customers FROM Demo.demo.Employees as employees FROM Demo.demo.Orders as orders FROM Demo.demo.Order_Details as order_lines FROM Demo.demo.Countries as countries FROM Demo.demo.Provinces as provinces where (^{suppliers.}^.Country = ^{countries.}^.Name) where (^{customers.}^.Country = ^{countries.}^.Name) where (^{employees.}^.Country = ^{countries.}^.Name) where (^{orders.}^.ShipCountry = ^{countries.}^.Name) { create virtrdf:NorthwindDemo as graph iri ("http://^{URIQADefaultHost}^/Northwind") option (exclusive) { northwind:CustomerContact (customers.CustomerID) a foaf:Person as virtrdf:CustomerContact-foaf_Person . northwind:CustomerContact (customers.CustomerID) a northwind:CustomerContact as virtrdf:CustomerContact-CustomerContact; foaf:name customers.ContactName as virtrdf:CustomerContact-contact_name ; foaf:phone northwind:Phone (customers.Phone) as virtrdf:CustomerContact-foaf_phone ; northwind:is_contact_at northwind:Customer (customers.CustomerID) as virtrdf:CustomerContact-is_contact_at ; northwind:country northwind:Country (customers.Country) as virtrdf:CustomerContact-country ; rdfs:isDefinedBy northwind: . northwind:CustomerContactDoc (customers.CustomerID) a northwind:CustomerContactDoc as virtrdf:CustomerContactDoc-CustomerID ; a foaf:Document as virtrdf:CustomerContactDoc-foaf_DocCustomerID ; foaf:primaryTopic northwind:CustomerContact (customers.CustomerID) as virtrdf:CustomerContactDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:Country (customers.Country) northwind:is_country_of northwind:CustomerContact (customers.CustomerID) as virtrdf:CustomerContact-is_country_of . northwind:Product (products.ProductID) a northwind:Product as virtrdf:Product-ProductID ; northwind:has_category northwind:Category (products.CategoryID) as virtrdf:Product-product_has_category ; northwind:has_supplier northwind:Supplier (products.SupplierID) as virtrdf:Product-product_has_supplier ; northwind:productName products.ProductName as virtrdf:Product-name_of_product ; northwind:quantityPerUnit products.QuantityPerUnit as virtrdf:Product-quantity_per_unit ; northwind:unitPrice products.UnitPrice as virtrdf:Product-unit_price ; northwind:unitsInStock products.UnitsInStock as virtrdf:Product-units_in_stock ; northwind:unitsOnOrder products.UnitsOnOrder as virtrdf:Product-units_on_order ; northwind:reorderLevel products.ReorderLevel as virtrdf:Product-reorder_level ; northwind:discontinued products.Discontinued as virtrdf:Product-discontinued ; rdfs:isDefinedBy northwind: . northwind:ProductDoc (products.ProductID) a northwind:ProductDoc as virtrdf:ProductDoc-ProductID ; a foaf:Document as virtrdf:ProductDoc-foaf_DocProductID ; foaf:primaryTopic northwind:Product (products.ProductID) as virtrdf:ProductDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:Category (products.CategoryID) northwind:category_of northwind:Product (products.ProductID) as virtrdf:Product-category_of . northwind:Supplier (products.SupplierID) northwind:supplier_of northwind:Product (products.ProductID) as virtrdf:Product-supplier_of . northwind:Supplier (suppliers.SupplierID) a northwind:Supplier as virtrdf:Supplier-SupplierID ; northwind:companyName suppliers.CompanyName as virtrdf:Supplier-company_name ; northwind:contactName suppliers.ContactName as virtrdf:Supplier-contact_name ; northwind:contactTitle suppliers.ContactTitle as virtrdf:Supplier-contact_title ; northwind:address suppliers.Address as virtrdf:Supplier-address ; northwind:city northwind:dbpedia_iri2(suppliers.City) as virtrdf:Supplier-dbpediacity ; northwind:region suppliers.Region as virtrdf:Supplier-region ; northwind:postalCode suppliers.PostalCode as virtrdf:Supplier-postal_code ; northwind:country northwind:Country(suppliers.Country) as virtrdf:Supplier-country ; northwind:phone northwind:Phone (suppliers.Phone) as virtrdf:Supplier-phone ; northwind:fax northwind:Fax (suppliers.Fax) as virtrdf:Supplier-fax ; northwind:homePage suppliers.HomePage as virtrdf:Supplier-home_page ; rdfs:isDefinedBy northwind: . northwind:SupplierDoc (suppliers.SupplierID) a northwind:SupplierDoc as virtrdf:SupplierDoc-SupplierID ; a foaf:Document as virtrdf:SupplierDoc-foaf_DocSupplierID ; foaf:primaryTopic northwind:Supplier (suppliers.SupplierID) as virtrdf:SupplierDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:Country (suppliers.Country) northwind:is_country_of northwind:Supplier (suppliers.SupplierID) as virtrdf:Supplier-is_country_of . northwind:Category (categories.CategoryID) a northwind:Category as virtrdf:Category-CategoryID ; northwind:categoryName categories.CategoryName as virtrdf:Category-home_page ; northwind:description categories.Description as virtrdf:Category-description ; foaf:img northwind:CategoryPhoto(categories.CategoryID) as virtrdf:Category-categories.CategoryPhoto ; rdfs:isDefinedBy northwind: . northwind:CategoryDoc (categories.CategoryID) a northwind:CategoryDoc as virtrdf:CategoryDoc-CategoryID ; a foaf:Document as virtrdf:CategoryDoc-foaf_DocCategoryID ; foaf:primaryTopic northwind:Category (categories.CategoryID) as virtrdf:CategoryDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:CategoryPhoto(categories.CategoryID) a northwind:CategoryPhoto as virtrdf:Category-categories.CategoryPhotoID ; rdfs:isDefinedBy northwind: . northwind:Shipper (shippers.ShipperID) a northwind:Shipper as virtrdf:Shipper-ShipperID ; northwind:companyName shippers.CompanyName as virtrdf:Shipper-company_name ; northwind:phone northwind:Phone (shippers.Phone) as virtrdf:Shipper-phone ; rdfs:isDefinedBy northwind: . northwind:ShipperDoc (shippers.ShipperID) a northwind:ShipperDoc as virtrdf:ShipperDoc-ShipperID ; a foaf:Document as virtrdf:ShipperDoc-foaf_DocShipperID ; foaf:primaryTopic northwind:Shipper (shippers.ShipperID) as virtrdf:ShipperDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:Customer (customers.CustomerID) a northwind:Customer as virtrdf:Customer-CustomerID2 ; a foaf:Organization as virtrdf:Customer-CustomerID ; foaf:name customers.CompanyName as virtrdf:Customer-foaf_name ; northwind:companyName customers.CompanyName as virtrdf:Customer-company_name ; northwind:has_contact northwind:CustomerContact (customers.CustomerID) as virtrdf:Customer-contact ; northwind:country northwind:Country (customers.Country) as virtrdf:Customer-country ; northwind:contactName customers.ContactName as virtrdf:Customer-contact_name ; northwind:contactTitle customers.ContactTitle as virtrdf:Customer-contact_title ; northwind:address customers.Address as virtrdf:Customer-address ; northwind:city northwind:dbpedia_iri2(customers.City) as virtrdf:Customer-dbpediacity ; northwind:region customers.Region as virtrdf:Customer-region ; northwind:PostalCode customers.PostalCode as virtrdf:Customer-postal_code ; foaf:phone northwind:Phone (customers.Phone) as virtrdf:Customer-foaf_phone ; northwind:phone northwind:Phone (customers.Phone) as virtrdf:Customer-phone ; northwind:fax northwind:Fax (customers.Fax) as virtrdf:Customer-fax ; rdfs:isDefinedBy northwind: . northwind:CustomerDoc (customers.CustomerID) a northwind:CustomerDoc as virtrdf:CustomerDoc-CustomerID2 ; a foaf:Document as virtrdf:CustomerDoc-CustomerID3 ; foaf:primaryTopic northwind:Customer (customers.CustomerID) as virtrdf:CustomerDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:Country (customers.Country) northwind:is_country_of northwind:Customer (customers.CustomerID) as virtrdf:Customer-is_country_of . northwind:Employee (employees.FirstName, employees.LastName, employees.EmployeeID) a northwind:Employee as virtrdf:Employee-EmployeeID2 ; a foaf:Person as virtrdf:Employee-EmployeeID ; foaf:surname employees.LastName as virtrdf:Employee-foaf_last_name ; northwind:lastName employees.LastName as virtrdf:Employee-last_name ; foaf:firstName employees.FirstName as virtrdf:Employee-foaf_first_name ; northwind:firstName employees.FirstName as virtrdf:Employee-first_name ; foaf:title employees.Title as virtrdf:Employee-title ; northwind:titleOfCourtesy employees.TitleOfCourtesy as virtrdf:Employee-title_of_courtesy ; foaf:birthday employees.BirthDate as virtrdf:Employee-foaf_birth_date ; northwind:birthday employees.BirthDate as virtrdf:Employee-birth_date ; northwind:hireDate employees.HireDate as virtrdf:Employee-hire_date ; northwind:address employees.Address as virtrdf:Employee-address ; northwind:city northwind:dbpedia_iri2(employees.City) as virtrdf:Employee-dbpediacity ; northwind:region employees.Region as virtrdf:Employee-region ; northwind:postalCode employees.PostalCode as virtrdf:Employee-postal_code ; northwind:country northwind:Country(employees.Country) as virtrdf:Employee-country ; foaf:phone employees.HomePhone as virtrdf:Employee-home_phone ; northwind:extension employees.Extension as virtrdf:Employee-extension ; northwind:notes employees.Notes as virtrdf:Employee-notes ; northwind:reportsTo northwind:Employee(employees.FirstName, employees.LastName, employees.ReportsTo) where (^{employees.}^.ReportsTo = ^{employees.}^.EmployeeID) as virtrdf:Employee-reports_to ; foaf:img northwind:EmployeePhoto(employees.EmployeeID) as virtrdf:Employee-employees.EmployeePhoto ; rdfs:isDefinedBy northwind: . northwind:EmployeeDoc (employees.FirstName, employees.LastName, employees.EmployeeID) a northwind:EmployeeDoc as virtrdf:EmployeeDoc-EmployeeID2 ; a foaf:Document as virtrdf:EmployeeDoc-EmployeeID3 ; foaf:primaryTopic northwind:Employee (employees.FirstName, employees.LastName, employees.EmployeeID) as virtrdf:EmployeeDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:EmployeePhoto(employees.EmployeeID) a northwind:EmployeePhoto as virtrdf:Employee-employees.EmployeePhotoId ; rdfs:isDefinedBy northwind: . northwind:Employee (employees.FirstName, employees.LastName, orders.EmployeeID) northwind:is_salesrep_of northwind:Order (orders.OrderID) where (^{orders.}^.EmployeeID = ^{employees.}^.EmployeeID) as virtrdf:Order-is_salesrep_of . northwind:Country (employees.Country) northwind:is_country_of northwind:Employee (employees.FirstName, employees.LastName, employees.EmployeeID) as virtrdf:Employee-is_country_of . northwind:Order (orders.OrderID) a northwind:Order as virtrdf:Order-Order ; northwind:has_customer northwind:Customer (orders.CustomerID) as virtrdf:Order-order_has_customer ; northwind:has_salesrep northwind:Employee (employees.FirstName, employees.LastName, orders.EmployeeID) where (^{orders.}^.EmployeeID = ^{employees.}^.EmployeeID) as virtrdf:Customer-has_salesrep ; northwind:has_employee northwind:Employee (employees.FirstName, employees.LastName, orders.EmployeeID) where (^{orders.}^.EmployeeID = ^{employees.}^.EmployeeID) as virtrdf:Order-order_has_employee ; northwind:orderDate orders.OrderDate as virtrdf:Order-order_date ; northwind:requiredDate orders.RequiredDate as virtrdf:Order-required_date ; northwind:shippedDate orders.ShippedDate as virtrdf:Order-shipped_date ; northwind:order_ship_via northwind:Shipper (orders.ShipVia) as virtrdf:Order-order_ship_via ; northwind:freight orders.Freight as virtrdf:Order-freight ; northwind:shipName orders.ShipName as virtrdf:Order-ship_name ; northwind:shipAddress orders.ShipAddress as virtrdf:Order-ship_address ; northwind:shipCity northwind:dbpedia_iri2(orders.ShipCity) as virtrdf:Order-dbpediaship_city ; northwind:shipRegion orders.ShipRegion as virtrdf:Order-ship_region ; northwind:shipPostal_code orders.ShipPostalCode as virtrdf:Order-ship_postal_code ; northwind:shipCountry northwind:Country(orders.ShipCountry) as virtrdf:ship_country ; rdfs:isDefinedBy northwind: . northwind:OrderDoc (orders.OrderID) a northwind:OrderDoc as virtrdf:OrderDoc-OrderID2 ; a foaf:Document as virtrdf:OrderDoc-OrderID3 ; foaf:primaryTopic northwind:Order (orders.OrderID) as virtrdf:OrderDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:Country (orders.ShipCountry) northwind:is_ship_country_of northwind:Order (orders.OrderID) as virtrdf:Order-is_country_of . northwind:Customer (orders.CustomerID) northwind:has_order northwind:Order (orders.OrderID) as virtrdf:Order-has_order . northwind:Shipper (orders.ShipVia) northwind:ship_order northwind:Order (orders.OrderID) as virtrdf:Order-ship_order . northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) a northwind:OrderLine as virtrdf:OrderLine-OrderLines ; northwind:has_order_id northwind:Order (order_lines.OrderID) as virtrdf:order_lines_has_order_id ; northwind:has_product_id northwind:Product (order_lines.ProductID) as virtrdf:order_lines_has_product_id ; northwind:unitPrice order_lines.UnitPrice as virtrdf:OrderLine-unit_price ; northwind:quantity order_lines.Quantity as virtrdf:OrderLine-quantity ; northwind:discount order_lines.Discount as virtrdf:OrderLine-discount ; rdfs:isDefinedBy northwind: . northwind:OrderLineDoc (order_lines.OrderID, order_lines.ProductID) a northwind:OrderLineDoc as virtrdf:OrderLineDoc-OrderLineID2 ; a foaf:Document as virtrdf:OrderLineDoc-OrderLineID3 ; foaf:primaryTopic northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) as virtrdf:OrderLineDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:Order (orders.OrderID) northwind:is_order_of northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) where (^{orders.}^.OrderID = ^{order_lines.}^.OrderID) as virtrdf:Order-is_order_of . northwind:Product (products.ProductID) northwind:is_product_of northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) where (^{products.}^.ProductID = ^{order_lines.}^.ProductID) as virtrdf:Product-is_product_of . northwind:Country (countries.Name) a northwind:Country as virtrdf:Country-Type2 ; a wgs:SpatialThing as virtrdf:Country-Type ; owl:sameAs northwind:dbpedia_iri2 (countries.Name) ; northwind:name countries.Name as virtrdf:Country-Name ; northwind:code countries.Code as virtrdf:Country-Code ; northwind:smallFlagDAVResourceName countries.SmallFlagDAVResourceName as virtrdf:Country-SmallFlagDAVResourceName ; northwind:largeFlagDAVResourceName countries.LargeFlagDAVResourceName as virtrdf:Country-LargeFlagDAVResourceName ; northwind:smallFlagDAVResourceURI northwind:Flag(countries.SmallFlagDAVResourceURI) as virtrdf:Country-SmallFlagDAVResourceURI ; northwind:largeFlagDAVResourceURI northwind:Flag(countries.LargeFlagDAVResourceURI) as virtrdf:Country-LargeFlagDAVResourceURI ; wgs:lat countries.Lat as virtrdf:Country-Lat ; wgs:long countries.Lng as virtrdf:Country-Lng ; rdfs:isDefinedBy northwind: . northwind:CountryDoc (countries.Name) a northwind:CountryDoc as virtrdf:CountryDoc-CountryID2 ; a foaf:Document as virtrdf:CountryDoc-CountryID3 ; foaf:primaryTopic northwind:Country (countries.Name) as virtrdf:CountryDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:Country (countries.Name) northwind:has_province northwind:Province (provinces.CountryCode, provinces.Province) where (^{provinces.}^.CountryCode = ^{countries.}^.Code) as virtrdf:Country-has_province . northwind:Province (provinces.CountryCode, provinces.Province) a northwind:Province as virtrdf:Province-Provinces ; owl:sameAs northwind:dbpedia_iri2 (provinces.Province) ; northwind:has_country_code provinces.CountryCode as virtrdf:has_country_code ; northwind:provinceName provinces.Province as virtrdf:Province-ProvinceName ; rdfs:isDefinedBy northwind: . northwind:ProvinceDoc (provinces.CountryCode, provinces.Province) a northwind:ProvinceDoc as virtrdf:ProvinceDoc-ProvinceID2 ; a foaf:Document as virtrdf:ProvinceDoc-ProvinceID3 ; foaf:primaryTopic northwind:Province (provinces.CountryCode, provinces.Province) as virtrdf:ProvinceDoc-foaf_primarytopic ; rdfs:isDefinedBy northwind: . northwind:Province (provinces.CountryCode, provinces.Province) northwind:is_province_of northwind:Country (countries.Name) where (^{countries.}^.Code = ^{provinces.}^.CountryCode) as virtrdf:Province-country_of . }. }. ; delete FROM DB.DBA.URL_REWRITE_RULE_LIST where urrl_list like 'demo_nw%'; delete FROM DB.DBA.URL_REWRITE_RULE where urr_rule like 'demo_nw%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'demo_nw_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=DESCRIBE+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%23this%%3E+%%3Chttp%%3A//^{URIQADefaultHost}^%U%%3E+FROM+%%3Chttp%%3A//^{URIQADefaultHost}^/Northwind%%3E&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'demo_nw_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'demo_nw_rule_list1', 1, vector ( 'demo_nw_rule1', 'demo_nw_rule2' )); VHOST_REMOVE (lpath=>'/Northwind'); DB.DBA.VHOST_DEFINE (lpath=>'/Northwind', ppath=>'/DAV/home/demo/', vsp_user=>'dba', is_dav=>1, is_brws=>0, opts=>vector ('url_rewrite', 'demo_nw_rule_list1')); create procedure DB.DBA.LOAD_NW_ONTOLOGY_FROM_DAV() { declare content1, urihost varchar; SELECT cast (RES_CONTENT as varchar) into content1 FROM WS.WS.SYS_DAV_RES where RES_FULL_PATH = '/DAV/VAD/demo/sql/nw.owl'; DB.DBA.RDF_LOAD_RDFXML (content1, 'http://demo.openlinksw.com/schemas/northwind#', 'http://demo.openlinksw.com/schemas/NorthwindOntology/1.0/'); urihost := cfg_item_value(virtuoso_ini_path(), 'URIQA','DefaultHost'); if (urihost = 'demo.openlinksw.com') { DB.DBA.VHOST_REMOVE (lpath=>'/schemas/northwind'); DB.DBA.VHOST_DEFINE (lpath=>'/schemas/northwind', ppath=>'/DAV/VAD/demo/sql/nw.owl', vsp_user=>'dba', is_dav=>1, is_brws=>0); DB.DBA.VHOST_REMOVE (lpath=>'/schemas/northwind#'); DB.DBA.VHOST_DEFINE (lpath=>'/schemas/northwind#', ppath=>'/DAV/VAD/demo/sql/nw.owl', vsp_user=>'dba', is_dav=>1, is_brws=>0); } }; DB.DBA.LOAD_NW_ONTOLOGY_FROM_DAV(); drop procedure DB.DBA.LOAD_NW_ONTOLOGY_FROM_DAV; DB.DBA.XML_SET_NS_DECL ('northwind', 'http://demo.openlinksw.com/schemas/northwind#', 2);
Basic Northwind Ontology
<?xml version="1.0" encoding="utf-8"?> <!-- - - - This file is part of the OpenLink Software Virtuoso Open-Source (VOS) - project. - - Copyright (C) 1998-2007 OpenLink Software - - This project is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; only version 2 of the License, dated June 1991. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - --> <rdf:RDF xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl ="http://www.w3.org/2002/07/owl#" xmlns:virtrdf="http://www.openlinksw.com/schemas/virtrdf#" xml:base="http://demo.openlinksw.com/schemas/northwind#"> <owl:Ontology rdf:about="http://demo.openlinksw.com/schemas/northwind#"> <rdfs:label>Northwind</rdfs:label> <rdfs:comment>Northwind database classes and properties</rdfs:comment> <virtrdf:catName>Northwind</virtrdf:catName> <virtrdf:version>1.00</virtrdf:version> </owl:Ontology> <rdfs:Class rdf:ID="Product"> <rdfs:label>Product</rdfs:label> </rdfs:Class> <rdf:Property rdf:ID="has_category"> <rdfs:range rdf:resource="#Category"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Category</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="has_supplier"> <rdfs:range rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Supplier</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProductName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ProductName</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="QuantityPerUnit"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>QuantityPerUnit</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="UnitPrice"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#double"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:domain rdf:resource="#OrderLine"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>UnitPrice</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="UnitsInStock"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>UnitsInStock</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="UnitsOnOrder"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>UnitsOnOrder</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ReorderLevel"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ReorderLevel</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Discontinued"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/> <rdfs:domain rdf:resource="#Product"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Discontinued</rdfs:label> </rdf:Property> <rdfs:Class rdf:ID="Supplier"> <rdfs:label>Supplier</rdfs:label> </rdfs:Class> <rdf:Property rdf:ID="CompanyName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Shipper"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>CompanyName</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ContactName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/name"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:domain rdf:resource="#CustomerContact"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ContactName</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ContactTitle"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/title"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ContactTitle</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Address"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Address</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="City"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>City</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Region"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Region</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="PostalCode"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>PostalCode</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="CountryName"> <rdfs:range rdf:resource="#Country"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:domain rdf:resource="#CustomerContact"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Country</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Phone"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/phone"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Shipper"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:domain rdf:resource="#CustomerContact"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Phone</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Fax"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:domain rdf:resource="#Customer"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Fax</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="HomePage"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Supplier"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>HomePage</rdfs:label> </rdf:Property> <rdfs:Class rdf:ID="Category"> <rdfs:label>Category</rdfs:label> </rdfs:Class> <rdf:Property rdf:ID="CategoryName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Category"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>CategoryName</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Description"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Category"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Description</rdfs:label> </rdf:Property> <rdfs:Class rdf:ID="Shipper"> <rdfs:label>Shipper</rdfs:label> </rdfs:Class> <rdfs:Class rdf:ID="CustomerContact"> <rdfs:label>CustomerContact</rdfs:label> <rdfs:subClassOf rdf:resource="http://xmlns.com/foaf/0.1/Person"/> </rdfs:Class> <rdfs:Class rdf:ID="Customer"> <rdfs:label>Customer</rdfs:label> <rdfs:subClassOf rdf:resource="http://xmlns.com/foaf/0.1/Organization"/> </rdfs:Class> <rdfs:Class rdf:ID="Employee"> <rdfs:label>Employee</rdfs:label> <rdfs:subClassOf rdf:resource="http://xmlns.com/foaf/0.1/Person"/> </rdfs:Class> <rdf:Property rdf:ID="LastName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/surname"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>LastName</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="FirstName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/firstName"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>FirstName</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Title"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/title"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Title</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="TitleOfCourtesy"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>TitleOfCourtesy</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="BirthDate"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/birthday"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>BirthDate</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="HireDate"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>HireDate</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Extension"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Extension</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Notes"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Notes</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ReportsTo"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/> <rdfs:domain rdf:resource="#Employee"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ReportsTo</rdfs:label> </rdf:Property> <rdfs:Class rdf:ID="Order"> <rdfs:label>Order</rdfs:label> </rdfs:Class> <rdf:Property rdf:ID="has_customer"> <rdfs:range rdf:resource="#Customer"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Customer</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="has_employee"> <rdfs:range rdf:resource="#Employee"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Employee</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="OrderDate"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>OrderDate</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="RequiredDate"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>RequiredDate</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ShippedDate"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ShippedDate</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="order_ship_via"> <rdfs:range rdf:resource="#Shipper"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Shipper</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Freight"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#double"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Freight</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ShipName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ShipName</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ShipAddress"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ShipAddress</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ShipCity"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ShipCity</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ShipRegion"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ShipRegion</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ShipPostalCode"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ShipPostalCode</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ShipCountry"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Order"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ShipCountry</rdfs:label> </rdf:Property> <rdfs:Class rdf:ID="OrderLine"> <rdfs:label>OrderLine</rdfs:label> </rdfs:Class> <rdf:Property rdf:ID="has_order_id"> <rdfs:range rdf:resource="#Order"/> <rdfs:domain rdf:resource="#OrderLine"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Order</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="has_product_id"> <rdfs:range rdf:resource="#Product"/> <rdfs:domain rdf:resource="#OrderLine"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Product</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Quantity"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/> <rdfs:domain rdf:resource="#OrderLine"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Quantity</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Discount"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#double"/> <rdfs:domain rdf:resource="#OrderLine"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Discount</rdfs:label> </rdf:Property> <rdfs:Class rdf:ID="Country"> <rdfs:label>Country</rdfs:label> <rdfs:subClassOf rdf:resource="http://www.w3.org/2003/01/geo/wgs84_pos#SpatialThing"/> </rdfs:Class> <rdf:Property rdf:ID="Name"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Country"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Name</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Code"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Country"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Code</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="SmallFlagDAVResourceName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Country"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>SmallFlagDAVResourceName</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="LargeFlagDAVResourceName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Country"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>LargeFlagDAVResourceName</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="SmallFlagDAVResourceURI"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Country"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>SmallFlagDAVResourceURI</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="LargeFlagDAVResourceURI"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Country"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>LargeFlagDAVResourceURI</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Lat"> <rdfs:range rdf:resource="ttp://www.w3.org/2003/01/geo/wgs84_pos#lat"/> <rdfs:domain rdf:resource="#Country"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Lat</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="Lng"> <rdfs:range rdf:resource="ttp://www.w3.org/2003/01/geo/wgs84_pos#lng"/> <rdfs:domain rdf:resource="#Country"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Lng</rdfs:label> </rdf:Property> <rdfs:Class rdf:ID="Province"> <rdfs:label>Province</rdfs:label> </rdfs:Class> <rdf:Property rdf:ID="has_country_code"> <rdfs:range rdf:resource="#Country"/> <rdfs:domain rdf:resource="#Provinces"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>Country Code</rdfs:label> </rdf:Property> <rdf:Property rdf:ID="ProvinceName"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="#Province"/> <rdfs:cardinality>1</rdfs:cardinality> <rdfs:label>ProvinceName</rdfs:label> </rdf:Property> </rdf:RDF>
Live links to a sample instance
Script to set up your own instance
-- Setup script for RDF views of Oracle 10 Human Resources Sample Database -- GRANT SELECT ON HR.orama.COUNTRIES TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.REGIONS TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.DEPARTMENTS TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.LOCATIONS TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.EMPLOYEES TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.JOBS TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.JOB_HISTORY TO "SPARQL", "SPARQL_UPDATE"; ------------------------------------------------------------------- -------- Create rdfs:Class definitions ---------------------------- ttlp ( ' @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix hr: <http://localhost:8890/schemas/oraclehr/> . hr:countries a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "COUNTRIES" ; rdfs:comment "Oracle HR COUNTRIES table" . hr:country_id a rdf:Property ; rdfs:domain hr:countries ; rdfs:range xsd:string ; rdfs:label "COUNTRY ID" . hr:country_name a rdf:Property ; rdfs:domain hr:countries ; rdfs:range xsd:string ; rdfs:label "COUNTRY NAME" . hr:region_id a rdf:Property ; rdfs:domain hr:countries ; rdfs:range hr:regions ; rdfs:label "REGION ID" . hr:regions a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "REGIONS" ; rdfs:comment "Oracle HR REGIONS table" . hr:region_id a rdf:Property ; rdfs:domain hr:regions ; rdfs:range xsd:integer ; rdfs:label "REGION ID" . hr:region_name a rdf:Property ; rdfs:domain hr:regions ; rdfs:range xsd:string ; rdfs:label "REGION NAME" . hr:departments a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "DEPARTMENTS" ; rdfs:comment "Oracle HR DEPARTMENT table" . hr:department_id a rdf:Property ; rdfs:domain hr:departments ; rdfs:range xsd:integer ; rdfs:label "DEPARTMENT ID" . hr:department_name a rdf:Property ; rdfs:domain hr:departments ; rdfs:range xsd:string ; rdfs:comment "DEPARTMENT NAME" . hr:manager_id a rdf:Property ; rdfs:domain hr:departments ; rdfs:range hr:employees ; rdfs:comment "MANAGER ID" . hr:location_id a rdf:Property ; rdfs:domain hr:departments ; rdfs:range hr:locations ; rdfs:comment "LOCATION ID" . hr:employees a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "employees" ; rdfs:comment "Oracle HR EMPLOYEES table" . hr:employee_id a rdf:Property ; rdfs:domain hr:employees; rdfs:range xsd:integer ; rdfs:label "EMPLOYEE ID" . hr:first_name a rdf:Property ; rdfs:domain hr:employees; rdfs:range xsd:string ; rdfs:label "FIRST NAME" . hr:last_name a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:string ; rdfs:label "LAST NAME" . hr:email a rdf:Property ; rdfs:domain hr:employees; rdfs:range xsd:string ; rdfs:label "EMAIL" . hr:phone_number a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:string ; rdfs:label "PHONE NUMBER" . hr:hire_date a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:date ; rdfs:label "HIRE DATE" . hr:job_id a rdf:Property ; rdfs:domain hr:employees; rdfs:range hr:jobs ; rdfs:label "JOB ID" . hr:salary a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:integer ; rdfs:label "SALARY" . hr:commission_pct a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:integer ; rdfs:label "COMMISSION PCT" . hr:manager_id a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:string ; rdfs:label "MANAGER ID" . hr:department_id a rdf:Property ; rdfs:domain hr:employees ; rdfs:range hr:departments ; rdfs:label "DEPARTMENT ID" . hr:jobs a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "JOBS" ; rdfs:comment "Oracle HR JOBS table" . hr:job_id a rdf:Property ; rdfs:domain hr:jobs ; rdfs:range xsd:string ; rdfs:label "JOB ID" . hr:job_title a rdf:Property ; rdfs:domain hr:jobs ; rdfs:range xsd:string ; rdfs:label "JOB TITLE" . hr:min_salary a rdf:Property ; rdfs:domain hr:jobs ; rdfs:range xsd:number; rdfs:label "MIN SALARY" . hr:max_salary a rdf:Property ; rdfs:domain hr:jobs ; rdfs:range xsd:number; rdfs:label "MAXSALARY" . hr:job_history a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "JOB HISTORY" ; rdfs:comment "Oracle HR JOB HISTORY table" . hr:employee_id a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range hr:employees ; rdfs:label "EMPLOYEE ID" . hr:start_date a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range xsd:date ; rdfs:label "START DATE" . hr:end_date a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range xsd:date ; rdfs:label "END DATE" . hr:job_id a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range hr:jobs ; rdfs:label "JOB ID" . hr:department_id a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range hr:departments ; rdfs:label "DEPARTMENT ID" . hr:locations a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "LOCATIONS" ; rdfs:comment "Oracle HR JOB LOCATIONS table" . hr:location_id a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:number ; rdfs:label "LOCATION ID" . hr:street_address a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:string ; rdfs:label "STREET ADDRESS" . hr:postal_code a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:string ; rdfs:label "POSTAL CODE" . hr:city a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:string ; rdfs:label "CITY" . hr:state_province a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:string ; rdfs:label "STATE PROVINCE" . hr:country_id a rdf:Property ; rdfs:domain hr:locations ; rdfs:range hr:countries ; rdfs:label "COUNTRY" . ', '', 'http://localhost:8890/schemas/oraclehr', 0); --------------------------------------------------------------- ----------- Create IRI Classes ------------- create function DB.DBA.JOB_HISTORY (in EMPLOYEE_ID integer, in START_DATE date) returns varchar { return sprintf_or_null ('http://localhost:8890/oraclehr/job_history/%d_%s#this', EMPLOYEE_ID, cast (START_DATE as varchar) ); } ; create function DB.DBA.JOB_HISTORY_INV_1 (in id varchar) returns integer { return sprintf_inverse (id, 'http://localhost:8890/oraclehr/job_history/%d_%s#this', 2)[0]; } ; create function DB.DBA.JOB_HISTORY_INV_2 (in id varchar) returns date { declare exit handler for sqlstate '*' { return NULL; }; return cast (sprintf_inverse (id, 'http://localhost:8890/oraclehr/job_history/%d_%s#this', 2)[1] as date); } ; GRANT EXECUTE ON DB.DBA.JOB_HISTORY TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON DB.DBA.JOB_HISTORY_URI_INV_1 TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON DB.DBA.JOB_HISTORY_URI_INV_2 TO "SPARQL", "SPARQL_UPDATE"; SPARQL create iri class <http://localhost:8890/schemas/oraclehr/countries_iri> "http://^{URIQADefaultHost}^/oraclehr/countries/%s#this" (in COUNTRY_ID varchar not null) . create iri class <http://localhost:8890/schemas/oraclehr/regions_iri> "http://^{URIQADefaultHost}^/oraclehr/regions/%d#this" (in REGION_ID integer not null) . create iri class <http://localhost:8890/schemas/oraclehr/departments_iri> "http://^{URIQADefaultHost}^/oraclehr/departments/%d#this" (in DEPARTMENT_ID integer not null) . create iri class <http://localhost:8890/schemas/oraclehr/employees_iri> "http://^{URIQADefaultHost}^/oraclehr/employees/%d#this" (in EMPLOYEE_ID integer not null) . create iri class <http://localhost:8890/schemas/oraclehr/jobs_iri> "http://^{URIQADefaultHost}^/oraclehr/jobs/%s#this" (in JOB_ID varchar not null) . create iri class <http://localhost:8890/schemas/oraclehr/job_history_iri> using function DB.DBA.JOB_HISTORY (in EMPLOYEE_ID integer not null, in START_DATE date not null) returns varchar not null, function DB.DBA.JOB_HISTORY_INV_1 (in id varchar) returns integer, function DB.DBA.JOB_HISTORY_INV_2 (in id varchar) returns date option (bijection, returns "http://localhost:8890/oraclehr/job_history/%d_%s#this") . create iri class <http://localhost:8890/schemas/oraclehr/locations_iri> "http://^{URIQADefaultHost}^/oraclehr/locations/%d#this" (in LOCATION_ID integer not null) . ; -------------------------------------------------------------------- ------------- Create Quad Store ------------------------------------ SPARQL prefix hr: <http://localhost:8890/schemas/oraclehr/> alter quad storage virtrdf:DefaultQuadStorage FROM HR.orama.COUNTRIES as countries_tbl FROM HR.orama.REGIONS as regions_tbl FROM HR.orama.DEPARTMENTS as departments_tbl FROM HR.orama.EMPLOYEES as employees_tbl FROM HR.orama.EMPLOYEES as employees_tbl_1 ### alias required to represent recursive FK relationship (hr: has_manager ) below. FROM HR.orama.JOBS as jobs_tbl FROM HR.orama.JOB_HISTORY as job_history_tbl FROM HR.orama.LOCATIONS as locations_tbl { create virtrdf:oraclehr as graph <http://localhost:8890/oraclehr> { hr:countries_iri(countries_tbl.COUNTRY_ID) a hr:countries as virtrdf:countires_country_id ; hr:country_name countries_tbl.COUNTRY_NAME as virtrdf:countries_country_name ; hr:region_id hr:regions_iri(regions_tbl.REGION_ID) where (^{countries_tbl.}^.REGION_ID = ^{regions_tbl.}^.REGION_ID) as virtrdf:countries_region_id . hr:regions_iri(regions_tbl.REGION_ID) a hr:regions as virtrdf:regions_region_id ; hr:region_name regions_tbl.REGION_NAME as virtrdf:regions_region_name . hr:departments_iri(departments_tbl.DEPARTMENT_ID) a hr:departments as virtrdf:departments_department_id ; hr:department_name departments_tbl.DEPARTMENT_NAME as virtrdf:departments_department_name ; hr:location_id hr:locations_iri(locations_tbl.LOCATION_ID) where (^{departments_tbl.}^.LOCATION_ID = ^{locations_tbl.}^.LOCATION_ID) as virtrdf:departments_location_id ; hr:manager_id hr:employees_iri(employees_tbl.EMPLOYEE_ID) where (^{departments_tbl.}^.MANAGER_ID = ^{employees_tbl.}^.EMPLOYEE_ID) as virtrdf:departments_manager_id . hr:employees_iri(employees_tbl.EMPLOYEE_ID) a hr:employees as virtrdf:employees_employee_id ; hr:department_id hr:departments_iri(departments_tbl.DEPARTMENT_ID) where (^{employees_tbl.}^.DEPARTMENT_ID = ^{departments_tbl.}^.DEPARTMENT_ID) as virtrdf:employees_department_id ; hr:job_id hr:jobs_iri(jobs_tbl.JOB_ID) where (^{employees_tbl.}^.JOB_ID = ^{jobs_tbl.}^.JOB_ID) as virtrdf:employees_job_id ; hr:manager_id employees_tbl.MANAGER_ID as virtrdf:employees_manager_id ; hr:commissin_pct employees_tbl.COMMISSION_PCT as virtrdf:employees_commission_pct ; hr:email employees_tbl.EMAIL as virtrdf:employees_email ; hr:first_name employees_tbl.FIRST_NAME as virtrdf:employees_first_name ; hr:hire_date employees_tbl.HIRE_DATE as virtrdf:employees_hire_date ; hr:last_name employees_tbl.LAST_NAME as virtrdf:employees_last_name ; hr:phone_number employees_tbl.PHONE_NUMBER as virtrdf:employees_phone_number ; hr:salary employees_tbl.SALARY as virtrdf:employees_salary ; hr:has_job_history hr:job_history_iri(job_history_tbl.EMPLOYEE_ID, job_history_tbl.START_DATE) where (^{employees_tbl.}^.EMPLOYEE_ID = ^{job_history_tbl.}^.EMPLOYEE_ID) as virtrdf:employees_has_job_history; hr:has_manager hr:employees_iri(employees_tbl_1.EMPLOYEE_ID) where (^{employees_tbl.}^.MANAGER_ID = ^{employees_tbl_1.}^.EMPLOYEE_ID) as virtrdf:employees_has_manager. hr:locations_iri(locations_tbl.LOCATION_ID) a hr:locations as virtrdf:locations_location_id ; hr:country_id hr:countries_iri(countries_tbl.COUNTRY_ID) where (^{locations_tbl.}^.COUNTRY_ID = ^{countries_tbl.}^.COUNTRY_ID) as virtrdf:locations_country_id ; hr:city locations_tbl.CITY as virtrdf:locations_city ; hr:postal_code locations_tbl.POSTAL_CODE as virtrdf:locations_postal_code ; hr:state_province locations_tbl.STATE_PROVINCE as virtrdf:locations_state_province ; hr:street_address locations_tbl.STREET_ADDRESS as virtrdf:locations_street_address . hr:jobs_iri(jobs_tbl.JOB_ID) a hr:jobs as virtrdf:jobs_job_id ; hr:job_title jobs_tbl.JOB_TITLE as virtrdf:jobs_job_title ; hr:max_salary jobs_tbl.MAX_SALARY as virtrdf:jobs_max_salary ; hr:min_salary jobs_tbl.MIN_SALARY as virtrdf:jobs_min_salary . hr:job_history_iri(job_history_tbl.EMPLOYEE_ID, job_history_tbl.START_DATE) a hr:job_history as virtrdf:job_history_pk ; hr:employee_id hr:employees_iri(employees_tbl.EMPLOYEE_ID) where (^{job_history_tbl.}^.EMPLOYEE_ID = ^{employees_tbl.}^.EMPLOYEE_ID) as virtrdf:job_history_employee_id ; hr:department_id hr:departments_iri(departments_tbl.DEPARTMENT_ID) where (^{job_history_tbl.}^.DEPARTMENT_ID = ^{departments_tbl.}^.DEPARTMENT_ID) as virtrdf:job_history_department_id ; hr:job_id hr:jobs_iri(jobs_tbl.JOB_ID) where (^{job_history_tbl.}^.JOB_ID = ^{jobs_tbl.}^.JOB_ID) as virtrdf:job_history_job_id ; hr:start_date job_history_tbl.START_DATE as virtrdf:job_history_start_date ; hr:end_date job_history_tbl.END_DATE as virtrdf:job_history_end_date . } . } . ; delete from db.dba.url_rewrite_rule_list where urrl_list like 'oraclehr_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'oraclehr_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oraclehr_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oraclehr_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=DESCRIBE+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+FROM+%%3Chttp%%3A//localhost%%3A8890/oraclehr%%3E&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'oraclehr_rule_list1', 1, vector ( 'oraclehr_rule1', 'oraclehr_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/oraclehr'); VHOST_DEFINE ( lpath=>'/oraclehr', ppath=>'/DAV/oraclehr/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'oraclehr_rule_list1') ); delete from db.dba.url_rewrite_rule_list where urrl_list like 'oracle_schemas_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'oracle_schemas_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oracle_schemas_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oracle_schemas_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}%%0D%%0AFROM+%%3Chttp%%3A//localhost%%3A8890/schemas/oraclehr%%3E+%%0D%%0AWHERE+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path','path','*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'oracle_schemas_rule_list1', 1, vector ( 'oracle_schemas_rule1', 'oracle_schemas_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/schema/oraclehr'); VHOST_DEFINE ( lpath=>'/schemas/oraclehr', ppath=>'/DAV/schemas/oraclehr/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'oracle_schemas_rule_list1') ); DB.DBA.XML_SET_NS_DECL ('hr', 'http://^{URIQADefaultHost}^/schemas/oraclehr/', 2);
Live links to a sample instance
Script to set up your own instance
-- Setup script for RDF views of Oracle 10 Human Resources Sample Database -- GRANT SELECT ON HR.orama.COUNTRIES TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.REGIONS TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.DEPARTMENTS TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.LOCATIONS TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.EMPLOYEES TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.JOBS TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON HR.orama.JOB_HISTORY TO "SPARQL", "SPARQL_UPDATE"; ------------------------------------------------------------------- -------- Create rdfs:Class definitions ---------------------------- ttlp ( ' @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix hr: <http://localhost:8890/schemas/oraclehr/> . hr:countries a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "COUNTRIES" ; rdfs:comment "Oracle HR COUNTRIES table" . hr:country_id a rdf:Property ; rdfs:domain hr:countries ; rdfs:range xsd:string ; rdfs:label "COUNTRY ID" . hr:country_name a rdf:Property ; rdfs:domain hr:countries ; rdfs:range xsd:string ; rdfs:label "COUNTRY NAME" . hr:region_id a rdf:Property ; rdfs:domain hr:countries ; rdfs:range hr:regions ; rdfs:label "REGION ID" . hr:regions a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "REGIONS" ; rdfs:comment "Oracle HR REGIONS table" . hr:region_id a rdf:Property ; rdfs:domain hr:regions ; rdfs:range xsd:integer ; rdfs:label "REGION ID" . hr:region_name a rdf:Property ; rdfs:domain hr:regions ; rdfs:range xsd:string ; rdfs:label "REGION NAME" . hr:departments a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "DEPARTMENTS" ; rdfs:comment "Oracle HR DEPARTMENT table" . hr:department_id a rdf:Property ; rdfs:domain hr:departments ; rdfs:range xsd:integer ; rdfs:label "DEPARTMENT ID" . hr:department_name a rdf:Property ; rdfs:domain hr:departments ; rdfs:range xsd:string ; rdfs:comment "DEPARTMENT NAME" . hr:manager_id a rdf:Property ; rdfs:domain hr:departments ; rdfs:range hr:employees ; rdfs:comment "MANAGER ID" . hr:location_id a rdf:Property ; rdfs:domain hr:departments ; rdfs:range hr:locations ; rdfs:comment "LOCATION ID" . hr:employees a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "employees" ; rdfs:comment "Oracle HR EMPLOYEES table" . hr:employee_id a rdf:Property ; rdfs:domain hr:employees; rdfs:range xsd:integer ; rdfs:label "EMPLOYEE ID" . hr:first_name a rdf:Property ; rdfs:domain hr:employees; rdfs:range xsd:string ; rdfs:label "FIRST NAME" . hr:last_name a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:string ; rdfs:label "LAST NAME" . hr:email a rdf:Property ; rdfs:domain hr:employees; rdfs:range xsd:string ; rdfs:label "EMAIL" . hr:phone_number a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:string ; rdfs:label "PHONE NUMBER" . hr:hire_date a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:date ; rdfs:label "HIRE DATE" . hr:job_id a rdf:Property ; rdfs:domain hr:employees; rdfs:range hr:jobs ; rdfs:label "JOB ID" . hr:salary a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:integer ; rdfs:label "SALARY" . hr:commission_pct a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:integer ; rdfs:label "COMMISSION PCT" . hr:manager_id a rdf:Property ; rdfs:domain hr:employees ; rdfs:range xsd:string ; rdfs:label "MANAGER ID" . hr:department_id a rdf:Property ; rdfs:domain hr:employees ; rdfs:range hr:departments ; rdfs:label "DEPARTMENT ID" . hr:jobs a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "JOBS" ; rdfs:comment "Oracle HR JOBS table" . hr:job_id a rdf:Property ; rdfs:domain hr:jobs ; rdfs:range xsd:string ; rdfs:label "JOB ID" . hr:job_title a rdf:Property ; rdfs:domain hr:jobs ; rdfs:range xsd:string ; rdfs:label "JOB TITLE" . hr:min_salary a rdf:Property ; rdfs:domain hr:jobs ; rdfs:range xsd:number; rdfs:label "MIN SALARY" . hr:max_salary a rdf:Property ; rdfs:domain hr:jobs ; rdfs:range xsd:number; rdfs:label "MAXSALARY" . hr:job_history a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "JOB HISTORY" ; rdfs:comment "Oracle HR JOB HISTORY table" . hr:employee_id a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range hr:employees ; rdfs:label "EMPLOYEE ID" . hr:start_date a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range xsd:date ; rdfs:label "START DATE" . hr:end_date a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range xsd:date ; rdfs:label "END DATE" . hr:job_id a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range hr:jobs ; rdfs:label "JOB ID" . hr:department_id a rdf:Property ; rdfs:domain hr:job_history ; rdfs:range hr:departments ; rdfs:label "DEPARTMENT ID" . hr:locations a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/oraclehr> ; rdfs:label "LOCATIONS" ; rdfs:comment "Oracle HR JOB LOCATIONS table" . hr:location_id a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:number ; rdfs:label "LOCATION ID" . hr:street_address a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:string ; rdfs:label "STREET ADDRESS" . hr:postal_code a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:string ; rdfs:label "POSTAL CODE" . hr:city a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:string ; rdfs:label "CITY" . hr:state_province a rdf:Property ; rdfs:domain hr:locations ; rdfs:range xsd:string ; rdfs:label "STATE PROVINCE" . hr:country_id a rdf:Property ; rdfs:domain hr:locations ; rdfs:range hr:countries ; rdfs:label "COUNTRY" . ', '', 'http://localhost:8890/schemas/oraclehr', 0); --------------------------------------------------------------- ----------- Create IRI Classes ------------- create function DB.DBA.JOB_HISTORY (in EMPLOYEE_ID integer, in START_DATE date) returns varchar { return sprintf_or_null ('http://localhost:8890/oraclehr/job_history/%d_%s#this', EMPLOYEE_ID, cast (START_DATE as varchar) ); } ; create function DB.DBA.JOB_HISTORY_INV_1 (in id varchar) returns integer { return sprintf_inverse (id, 'http://localhost:8890/oraclehr/job_history/%d_%s#this', 2)[0]; } ; create function DB.DBA.JOB_HISTORY_INV_2 (in id varchar) returns date { declare exit handler for sqlstate '*' { return NULL; }; return cast (sprintf_inverse (id, 'http://localhost:8890/oraclehr/job_history/%d_%s#this', 2)[1] as date); } ; GRANT EXECUTE ON DB.DBA.JOB_HISTORY TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON DB.DBA.JOB_HISTORY_URI_INV_1 TO "SPARQL", "SPARQL_UPDATE"; GRANT EXECUTE ON DB.DBA.JOB_HISTORY_URI_INV_2 TO "SPARQL", "SPARQL_UPDATE"; SPARQL create iri class <http://localhost:8890/schemas/oraclehr/countries_iri> "http://^{URIQADefaultHost}^/oraclehr/countries/%s#this" (in COUNTRY_ID varchar not null) . create iri class <http://localhost:8890/schemas/oraclehr/regions_iri> "http://^{URIQADefaultHost}^/oraclehr/regions/%d#this" (in REGION_ID integer not null) . create iri class <http://localhost:8890/schemas/oraclehr/departments_iri> "http://^{URIQADefaultHost}^/oraclehr/departments/%d#this" (in DEPARTMENT_ID integer not null) . create iri class <http://localhost:8890/schemas/oraclehr/employees_iri> "http://^{URIQADefaultHost}^/oraclehr/employees/%d#this" (in EMPLOYEE_ID integer not null) . create iri class <http://localhost:8890/schemas/oraclehr/jobs_iri> "http://^{URIQADefaultHost}^/oraclehr/jobs/%s#this" (in JOB_ID varchar not null) . create iri class <http://localhost:8890/schemas/oraclehr/job_history_iri> using function DB.DBA.JOB_HISTORY (in EMPLOYEE_ID integer not null, in START_DATE date not null) returns varchar not null, function DB.DBA.JOB_HISTORY_INV_1 (in id varchar) returns integer, function DB.DBA.JOB_HISTORY_INV_2 (in id varchar) returns date option (bijection, returns "http://localhost:8890/oraclehr/job_history/%d_%s#this") . create iri class <http://localhost:8890/schemas/oraclehr/locations_iri> "http://^{URIQADefaultHost}^/oraclehr/locations/%d#this" (in LOCATION_ID integer not null) . ; -------------------------------------------------------------------- ------------- Create Quad Store ------------------------------------ SPARQL prefix hr: <http://localhost:8890/schemas/oraclehr/> alter quad storage virtrdf:DefaultQuadStorage from HR.orama.COUNTRIES as countries_tbl from HR.orama.REGIONS as regions_tbl from HR.orama.DEPARTMENTS as departments_tbl from HR.orama.EMPLOYEES as employees_tbl from HR.orama.EMPLOYEES as employees_tbl_1 ### alias required to represent recursive FK relationship (hr: has_manager ) below. from HR.orama.JOBS as jobs_tbl from HR.orama.JOB_HISTORY as job_history_tbl from HR.orama.LOCATIONS as locations_tbl { create virtrdf:oraclehr as graph <http://localhost:8890/oraclehr> { hr:countries_iri(countries_tbl.COUNTRY_ID) a hr:countries as virtrdf:countires_country_id ; hr:country_name countries_tbl.COUNTRY_NAME as virtrdf:countries_country_name ; hr:region_id hr:regions_iri(regions_tbl.REGION_ID) where (^{countries_tbl.}^.REGION_ID = ^{regions_tbl.}^.REGION_ID) as virtrdf:countries_region_id . hr:regions_iri(regions_tbl.REGION_ID) a hr:regions as virtrdf:regions_region_id ; hr:region_name regions_tbl.REGION_NAME as virtrdf:regions_region_name . hr:departments_iri(departments_tbl.DEPARTMENT_ID) a hr:departments as virtrdf:departments_department_id ; hr:department_name departments_tbl.DEPARTMENT_NAME as virtrdf:departments_department_name ; hr:location_id hr:locations_iri(locations_tbl.LOCATION_ID) where (^{departments_tbl.}^.LOCATION_ID = ^{locations_tbl.}^.LOCATION_ID) as virtrdf:departments_location_id ; hr:manager_id hr:employees_iri(employees_tbl.EMPLOYEE_ID) where (^{departments_tbl.}^.MANAGER_ID = ^{employees_tbl.}^.EMPLOYEE_ID) as virtrdf:departments_manager_id . hr:employees_iri(employees_tbl.EMPLOYEE_ID) a hr:employees as virtrdf:employees_employee_id ; hr:department_id hr:departments_iri(departments_tbl.DEPARTMENT_ID) where (^{employees_tbl.}^.DEPARTMENT_ID = ^{departments_tbl.}^.DEPARTMENT_ID) as virtrdf:employees_department_id ; hr:job_id hr:jobs_iri(jobs_tbl.JOB_ID) where (^{employees_tbl.}^.JOB_ID = ^{jobs_tbl.}^.JOB_ID) as virtrdf:employees_job_id ; hr:manager_id employees_tbl.MANAGER_ID as virtrdf:employees_manager_id ; hr:commissin_pct employees_tbl.COMMISSION_PCT as virtrdf:employees_commission_pct ; hr:email employees_tbl.EMAIL as virtrdf:employees_email ; hr:first_name employees_tbl.FIRST_NAME as virtrdf:employees_first_name ; hr:hire_date employees_tbl.HIRE_DATE as virtrdf:employees_hire_date ; hr:last_name employees_tbl.LAST_NAME as virtrdf:employees_last_name ; hr:phone_number employees_tbl.PHONE_NUMBER as virtrdf:employees_phone_number ; hr:salary employees_tbl.SALARY as virtrdf:employees_salary ; hr:has_job_history hr:job_history_iri(job_history_tbl.EMPLOYEE_ID, job_history_tbl.START_DATE) where (^{employees_tbl.}^.EMPLOYEE_ID = ^{job_history_tbl.}^.EMPLOYEE_ID) as virtrdf:employees_has_job_history; hr:has_manager hr:employees_iri(employees_tbl_1.EMPLOYEE_ID) where (^{employees_tbl.}^.MANAGER_ID = ^{employees_tbl_1.}^.EMPLOYEE_ID) as virtrdf:employees_has_manager. hr:locations_iri(locations_tbl.LOCATION_ID) a hr:locations as virtrdf:locations_location_id ; hr:country_id hr:countries_iri(countries_tbl.COUNTRY_ID) where (^{locations_tbl.}^.COUNTRY_ID = ^{countries_tbl.}^.COUNTRY_ID) as virtrdf:locations_country_id ; hr:city locations_tbl.CITY as virtrdf:locations_city ; hr:postal_code locations_tbl.POSTAL_CODE as virtrdf:locations_postal_code ; hr:state_province locations_tbl.STATE_PROVINCE as virtrdf:locations_state_province ; hr:street_address locations_tbl.STREET_ADDRESS as virtrdf:locations_street_address . hr:jobs_iri(jobs_tbl.JOB_ID) a hr:jobs as virtrdf:jobs_job_id ; hr:job_title jobs_tbl.JOB_TITLE as virtrdf:jobs_job_title ; hr:max_salary jobs_tbl.MAX_SALARY as virtrdf:jobs_max_salary ; hr:min_salary jobs_tbl.MIN_SALARY as virtrdf:jobs_min_salary . hr:job_history_iri(job_history_tbl.EMPLOYEE_ID, job_history_tbl.START_DATE) a hr:job_history as virtrdf:job_history_pk ; hr:employee_id hr:employees_iri(employees_tbl.EMPLOYEE_ID) where (^{job_history_tbl.}^.EMPLOYEE_ID = ^{employees_tbl.}^.EMPLOYEE_ID) as virtrdf:job_history_employee_id ; hr:department_id hr:departments_iri(departments_tbl.DEPARTMENT_ID) where (^{job_history_tbl.}^.DEPARTMENT_ID = ^{departments_tbl.}^.DEPARTMENT_ID) as virtrdf:job_history_department_id ; hr:job_id hr:jobs_iri(jobs_tbl.JOB_ID) where (^{job_history_tbl.}^.JOB_ID = ^{jobs_tbl.}^.JOB_ID) as virtrdf:job_history_job_id ; hr:start_date job_history_tbl.START_DATE as virtrdf:job_history_start_date ; hr:end_date job_history_tbl.END_DATE as virtrdf:job_history_end_date . } . } . ; delete from db.dba.url_rewrite_rule_list where urrl_list like 'oraclehr_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'oraclehr_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oraclehr_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oraclehr_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=DESCRIBE+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+FROM+%%3Chttp%%3A//localhost%%3A8890/oraclehr%%3E&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'oraclehr_rule_list1', 1, vector ( 'oraclehr_rule1', 'oraclehr_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/oraclehr'); VHOST_DEFINE ( lpath=>'/oraclehr', ppath=>'/DAV/oraclehr/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'oraclehr_rule_list1') ); delete from db.dba.url_rewrite_rule_list where urrl_list like 'oracle_schemas_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'oracle_schemas_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oracle_schemas_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'oracle_schemas_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}%%0D%%0AFROM+%%3Chttp%%3A//localhost%%3A8890/schemas/oraclehr%%3E+%%0D%%0AWHERE+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path','path','*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'oracle_schemas_rule_list1', 1, vector ( 'oracle_schemas_rule1', 'oracle_schemas_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/schema/oraclehr'); VHOST_DEFINE ( lpath=>'/schemas/oraclehr', ppath=>'/DAV/schemas/oraclehr/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'oracle_schemas_rule_list1') ); DB.DBA.XML_SET_NS_DECL ('hr', 'http://^{URIQADefaultHost}^/schemas/oraclehr/', 2);
Version defined using explicit host - localhost:8890
-- $Id: rdfandsparql.xml,v 1.95.2.31 2010/03/30 17:59:29 source Exp $ -- Setup script for RDF view of portions of DB2 SAMPLE database included -- in DB2 Express Edition v9.5 -- -- The script assumes external DB2 tables are linked into Virtuoso using -- local schema name db2sample. DB..vd_remote_data_source ('db2ma-smpl', '', '<uid>','<pwd>); ATTACH TABLE "DB2ADMIN"."ACT" PRIMARY KEY ("ACTNO") AS "DB"."db2sample"."ACT" FROM 'db2ma-smpl'; ATTACH TABLE "DB2ADMIN"."DEPARTMENT" PRIMARY KEY ("DEPTNO") AS "DB"."db2sample"."DEPARTMENT" FROM 'db2ma-smpl'; ATTACH TABLE "DB2ADMIN"."EMPLOYEE" PRIMARY KEY ("EMPNO") AS "DB"."db2sample"."EMPLOYEE" FROM 'db2ma-smpl'; ATTACH TABLE "DB2ADMIN"."EMPPROJACT" PRIMARY KEY ("EMPNO", "PROJNO", "ACTNO", "EMSTDATE") AS "DB"."db2sample"."EMPPROJACT" FROM 'db2ma-smpl'; ATTACH TABLE "DB2ADMIN"."EMP_RESUME" PRIMARY KEY ("EMPNO", "RESUME_FORMAT) AS "DB"."db2sample"."EMP_RESUME" FROM 'db2ma-smpl'; ATTACH TABLE "DB2ADMIN"."PROJACT" PRIMARY KEY ("PROJNO", "ACTNO", "ACSTDATE") AS "DB"."db2sample"."PROJACT" FROM 'db2ma-smpl'; ATTACH TABLE "DB2ADMIN"."PROJECT" PRIMARY KEY ("PROJNO") AS "DB"."db2sample"."PROJECT" FROM 'db2ma-smpl'; COMMIT WORK; GRANT SELECT ON DB.db2sample.ACT TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON DB.db2sample.DEPARTMENT TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON DB.db2sample.EMPLOYEE TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON DB.db2sample.EMPPROJACT TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON DB.db2sample.EMP_RESUME TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON DB.db2sample.PROJACT TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON DB.db2sample.PROJECT TO "SPARQL", "SPARQL_UPDATE"; create function DB.DBA.PROJ_ACT_IRI ( in proj_no varchar, in act_no integer, in ac_st_date date ) returns varchar { declare _act_no, _datetime, _date any; _act_no := cast(act_no as varchar); _datetime := cast(ac_st_date as varchar); _date := left(_datetime, 10); return sprintf('http://localhost:8890/db2sample/proj_act/%s_%s_%s#this', proj_no, _act_no, _date); }; create function DB.DBA.PROJ_ACT_IRI_INV_1 (in proj_act_iri varchar) returns varchar { declare exit handler for sqlstate '*' { return NULL; }; declare parts any; parts := sprintf_inverse (proj_act_iri, 'http://localhost:8890/db2sample/proj_act/%s_%s_%s#this', 1); if (parts is not null) { return parts[0]; } return NULL; }; create function DB.DBA.PROJ_ACT_IRI_INV_2 (in proj_act_iri varchar) returns integer { declare exit handler for sqlstate '*' { return NULL; }; declare parts any; parts := sprintf_inverse (proj_act_iri, 'http://localhost:8890/db2sample/proj_act/%s_%s_%s#this', 1); if (parts is not null) { return cast(parts[1] as integer); } return NULL; }; create function DB.DBA.PROJ_ACT_IRI_INV_3 (in proj_act_iri varchar) returns date { declare exit handler for sqlstate '*' { return NULL; }; declare parts any; parts := sprintf_inverse (proj_act_iri, 'http://localhost:8890/db2sample/proj_act/%s_%s_%s#this', 1); if (parts is not null) { return cast(parts[2] as date); } return NULL; }; create function DB.DBA.EMP_PROJ_ACT_IRI ( in emp_no varchar, in proj_no varchar, in act_no integer, in emp_start_date date ) returns varchar { declare _act_no, _datetime, _date any; _act_no := cast(act_no as varchar); _datetime := cast(emp_start_date as varchar); _date := left(_datetime, 10); return sprintf( 'http://localhost:8890/db2sample/emp_proj_act/%s_%s_%s_%s#this', emp_no, proj_no, _act_no, _date); }; create function DB.DBA.EMP_PROJ_ACT_IRI_INV_1 (in emp_proj_act_iri varchar) returns varchar { declare exit handler for sqlstate '*' { return NULL; }; declare parts any; parts := sprintf_inverse (emp_proj_act_iri, 'http://localhost:8890/db2sample/emp_proj_act/%s_%s_%s_%s#this', 1); if (parts is not null) { return parts[0]; } return NULL; }; create function DB.DBA.EMP_PROJ_ACT_IRI_INV_2 (in emp_proj_act_iri varchar) returns varchar { declare exit handler for sqlstate '*' { return NULL; }; declare parts any; parts := sprintf_inverse (emp_proj_act_iri, 'http://localhost:8890/db2sample/emp_proj_act/%s_%s_%s_%s#this', 1); if (parts is not null) { return parts[1]; } return NULL; }; create function DB.DBA.EMP_PROJ_ACT_IRI_INV_3 (in emp_proj_act_iri varchar) returns integer { declare exit handler for sqlstate '*' { return NULL; }; declare parts any; parts := sprintf_inverse (emp_proj_act_iri, 'http://localhost:8890/db2sample/emp_proj_act/%s_%s_%s_%s#this', 1); if (parts is not null) { return cast(parts[2] as integer); } return NULL; }; create function DB.DBA.EMP_PROJ_ACT_IRI_INV_4 (in emp_proj_act_iri varchar) returns date { declare exit handler for sqlstate '*' { return NULL; }; declare parts any; parts := sprintf_inverse (emp_proj_act_iri, 'http://localhost:8890/db2sample/emp_proj_act/%s_%s_%s_%s#this', 1); if (parts is not null) { return cast(parts[3] as date); } return NULL; }; grant execute on DB.DBA.PROJ_ACT_IRI to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.PROJ_ACT_IRI_INV_1 to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.PROJ_ACT_IRI_INV_2 to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.PROJ_ACT_IRI_INV_3 to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.EMP_PROJ_ACT_IRI to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.EMP_PROJ_ACT_IRI_INV_1 to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.EMP_PROJ_ACT_IRI_INV_2 to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.EMP_PROJ_ACT_IRI_INV_3 to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.EMP_PROJ_ACT_IRI_INV_4 to "SPARQL", "SPARQL_UPDATE"; SPARQL drop graph <http://localhost:8890/schemas/db2sample> ; SPARQL drop graph <http://localhost:8890/db2sample> ; SPARQL drop quad map virtrdf:db2sample ; -------------------------- -- RDFS class definitions ttlp ( ' @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix opl: <http://localhost:8890/schemas/db2sample/> . opl:Act a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/db2sample> ; rdfs:label "Act" ; rdfs:comment "Activity" . # ACTNO SMALLINT PRIMARY KEY opl:act_no a rdf:Property ; rdfs:domain opl:Act ; rdfs:range xsd:integer ; rdfs:label "Activity number" . # ACTKWD VARCHAR(6) opl:act_kwd a rdf:Property ; rdfs:domain opl:Act ; rdfs:range xsd:string ; rdfs:label "Activity keyword" . # ACTDESC VARCHAR(20) opl:act_desc a rdf:Property ; rdfs:domain opl:Act ; rdfs:range xsd:string ; rdfs:label "Activity description" . ##### opl:Department a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/db2sample> ; rdfs:label "Department" ; rdfs:comment "Department" . # DEPTNO VARCHAR(3) PRIMARY KEY opl:dept_no a rdf:Property ; rdfs:domain opl:Department ; rdfs:range xsd:string ; rdfs:label "Department number" . # DEPTNAME VARCHAR(36) opl:dept_name a rdf:Property ; rdfs:domain opl:Department ; rdfs:range xsd:string ; rdfs:label "Department name" . # MGRNO CHAR(6) opl:dept_manager a rdf:Property ; rdfs:domain opl:Department ; rdfs:range xsd:Employee ; rdfs:label "Department manager" . # ADMRDEPT CHAR(3) opl:supervising_dept a rdf:Property ; rdfs:domain opl:Department ; rdfs:range opl:Department ; rdfs:label "Department reported to" . # LOCATION CHAR(6) opl:location a rdf:Property ; rdfs:domain opl:Department ; rdfs:range xsd:string ; rdfs:label "Location" . opl:employee_collection a rdf:Property ; rdfs:domain opl:Department ; rdfs:range opl:Employee ; rdfs:label "Department employees" . opl:dept_project_collection a rdf:Property ; rdfs:domain opl:Department ; rdfs:range opl:Project ; rdfs:label "Department projects" . ##### opl:Employee a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/db2sample> ; rdfs:label "Employee" ; rdfs:comment "Employee" . # EMPNO VARCHAR(6) PRIMARY KEY opl:emp_no a rdf:Property ; rdfs:domain opl:Employee; rdfs:range xsd:string ; rdfs:label "Employee number" . # FIRSTNME VARCHAR(12) opl:first_name a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:string ; rdfs:label "First name" . # MIDINIT VARCHAR(1) opl:middle_initial a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:string ; rdfs:label "Middle initial" . # LASTNAME VARCHAR(15) opl:last_name a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:string ; rdfs:label "Last name" . # WORKDEPT VARCHAR(3) opl:work_dept a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range opl:Department ; rdfs:label "Work department" . # PHONENO VARCHAR(4) opl:phone_no a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:string ; rdfs:label "Phone number" . # HIREDATE DATE opl:hire_date a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:date; rdfs:label "Hire date" . # JOB VARCHAR(8) opl:job a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:string ; rdfs:label "Job" . # EDLEVEL SMALLINT opl:education_level a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:integer ; rdfs:label "Education level" . # SEX VARCHAR(1) opl:gender a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:string ; rdfs:label "Gender" . # BIRTHDATE DATE opl:date_of_birth a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:date ; rdfs:label "Date of birth" . # SALARY DECIMAL(9,2) opl:salary a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:decimal ; rdfs:label "Salary" . # BONUS DECIMAL(9,2) opl:bonus a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:decimal ; rdfs:label "Bonus" . # COMM DECIMAL(9,2) opl:commission a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range xsd:decimal ; rdfs:label "Commission" . opl:resume_collection a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range opl:EmployeeResume ; rdfs:label "Employee resumes" . opl:projects_responsible_for_collection a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range opl:Project ; rdfs:label "responsible for project" . opl:activity_collection a rdf:Property ; rdfs:domain opl:Employee ; rdfs:range opl:EmpProjAct ; rdfs:label "project activities" . ##### opl:EmpProjAct a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/db2sample> ; rdfs:label "EmpProjAct" ; rdfs:comment "Employee project activity" . # EMPNO VARCHAR(6) PRIMARY KEY opl:epa_emp_no a rdf:Property ; rdfs:domain opl:EmpProjAct ; rdfs:range xsd:string ; rdfs:label "Employee number" . # PROJNO VARCHAR(6) PRIMARY KEY opl:epa_proj_no a rdf:Property ; rdfs:domain opl:EmpProjAct ; rdfs:range xsd:string ; rdfs:label "Project number" . # ACTNO SMALLINT PRIMARY KEY opl:epa_act_no a rdf:Property ; rdfs:domain opl:EmpProjAct ; rdfs:range xsd:string ; rdfs:label "Activity number" . # EMSTDATE DATE PRIMARY KEY opl:emp_start_date a rdf:Property ; rdfs:domain opl:EmpProjAct ; rdfs:range xsd:date ; rdfs:label "Employee activity start date" . # EMPTIME DECIMAL(5,2) opl:emp_time a rdf:Property ; rdfs:domain opl:EmpProjAct ; rdfs:range xsd:decimal ; rdfs:label "Employee time" . # EMENDATE DATE PRIMARY KEY opl:emp_end_date a rdf:Property ; rdfs:domain opl:EmpProjAct ; rdfs:range xsd:date ; rdfs:label "Employee activity end date" . opl:assigned_to a rdf:Property ; rdfs:domain opl:EmpProjAct ; rdfs:range opl:Employee ; rdfs:label "Assigned to" . opl:project_activity a rdf:Property ; rdfs:domain opl:EmpProjAct ; rdfs:range opl:ProjAct ; rdfs:label "Project activity" . ##### opl:EmployeeResume a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/db2sample> ; rdfs:label "EmployeeResume" ; rdfs:comment "Employee resume" . # EMPNO VARCHAR(6) PRIMARY KEY opl:er_emp_no a rdf:Property ; rdfs:domain opl:EmployeeResume ; rdfs:range xsd:string ; rdfs:label "Employee number" . # RESUME_FORMAT VARCHAR(10) PRIMARY KEY opl:resume_format a rdf:Property ; rdfs:domain opl:EmployeeResume ; rdfs:range xsd:string ; rdfs:label "Resume format" . # RESUME VARCHAR(5120) opl:resume a rdf:Property ; rdfs:domain opl:EmployeeResume ; rdfs:range xsd:string ; rdfs:label "Resume" . opl:resume_of a rdf:Property ; rdfs:domain opl:EmployeeResume ; rdfs:range opl:Employee ; rdfs:label "Resume subject" . ##### opl:ProjAct a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/db2sample> ; rdfs:label "ProjAct" ; rdfs:comment "Project activity" . # PROJNO VARCHAR(6) PRIMARY KEY opl:pa_proj_no a rdf:Property ; rdfs:domain opl:ProjAct ; rdfs:range xsd:string ; rdfs:label "Project number" . # ACTNO SMALLINT PRIMARY KEY opl:pa_act_no a rdf:Property ; rdfs:domain opl:ProjAct ; rdfs:range xsd:string ; rdfs:label "Activity number" . # ACSTDATE DATE PRIMARY KEY opl:ac_st_date a rdf:Property ; rdfs:domain opl:ProjAct ; rdfs:range xsd:date ; rdfs:label "Activity start date" . # ACSTAFF DECIMAL(5,2) opl:ac_staff a rdf:Property ; rdfs:domain opl:ProjAct ; rdfs:range xsd:decimal ; rdfs:label "Acstaff" . # ACENDATE DATE opl:ac_en_date a rdf:Property ; rdfs:domain opl:ProjAct ; rdfs:range xsd:date ; rdfs:label "Activity end date" . opl:project a rdf:Property ; rdfs:domain opl:ProjAct ; rdfs:range opl:Project ; rdfs:label "Project" . opl:activity a rdf:Property ; rdfs:domain opl:ProjAct ; rdfs:range opl:Act ; rdfs:label "Activity" . opl:employee_activity_collection a rdf:Property ; rdfs:domain opl:ProjAct ; rdfs:range opl:EmpProjAct ; rdfs:label "Employee activity collection" . ##### opl:Project a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/db2sample> ; rdfs:label "Project" ; rdfs:comment "Project" . # PROJNO VARCHAR(6) PRIMARY KEY opl:proj_no a rdf:Property ; rdfs:domain opl:Project ; rdfs:range xsd:string ; rdfs:label "Project number" . # PROJNAME VARCHAR(24) opl:proj_name a rdf:Property ; rdfs:domain opl:Project ; rdfs:range xsd:string ; rdfs:label "Project name" . # DEPTNO CHAR(3) opl:is_project_of_department a rdf:Property ; rdfs:domain opl:Project ; rdfs:range opl:Department ; rdfs:label "is project of department" . # RESPEMP VARCHAR(6) opl:resp_emp a rdf:Property ; rdfs:domain opl:Project ; rdfs:range opl:Employee ; rdfs:label "Employee responsible" . # PRSTAFF DECIMAL(5,2) opl:pr_staff a rdf:Property ; rdfs:domain opl:Project ; rdfs:range xsd:decimal ; rdfs:label "PrStaff" . # PRSTDATE DATE opl:pr_st_date a rdf:Property ; rdfs:domain opl:Project ; rdfs:range xsd:date ; rdfs:label "Project start date" . # PRENDATE DATE opl:pr_en_date a rdf:Property ; rdfs:domain opl:Project ; rdfs:range xsd:date ; rdfs:label "Project end date" . # MAJPROJ VARCHAR(6) opl:maj_proj a rdf:Property ; rdfs:domain opl:Project ; rdfs:range xsd:string ; rdfs:label "MajProj" . opl:proj_activity_collection a rdf:Property ; rdfs:domain opl:Project ; rdfs:range opl:ProjAct ; rdfs:label "Project activities" . ', '', 'http://localhost:8890/schemas/db2sample', 0); -------------------------- SPARQL prefix opl: <http://localhost:8890/schemas/db2sample/> create iri class <http://localhost:8890/schemas/db2sample/act_iri> "http://localhost:8890/db2sample/act/%d#this" ( in act_no integer not null ) . create iri class <http://localhost:8890/schemas/db2sample/department_iri> "http://localhost:8890/db2sample/department/%s#this" ( in dept_no varchar not null ) . create iri class <http://localhost:8890/schemas/db2sample/employee_iri> "http://localhost:8890/db2sample/employee/%s#this" ( in emp_no varchar not null ) . create iri class opl:emp_proj_act_iri using function DB.DBA.EMP_PROJ_ACT_IRI ( in emp_no varchar, in proj_no varchar, in act_no integer, in emp_start_date date ) returns varchar, function DB.DBA.EMP_PROJ_ACT_IRI_INV_1 (in emp_proj_act_iri varchar) returns varchar , function DB.DBA.EMP_PROJ_ACT_IRI_INV_2 (in emp_proj_act_iri varchar) returns varchar , function DB.DBA.EMP_PROJ_ACT_IRI_INV_3 (in emp_proj_act_iri varchar) returns integer , function DB.DBA.EMP_PROJ_ACT_IRI_INV_4 (in emp_proj_act_iri varchar) returns date option (bijection, returns "http://localhost:8890/db2sample/emp_proj_act/%s_%s_%s_%s#this") . create iri class <http://localhost:8890/schemas/db2sample/employee_resume_iri> "http://localhost:8890/db2sample/employee_resume/%s_%s#this" ( in emp_no varchar not null, in resume_format varchar not null ) . create iri class opl:proj_act_iri using function DB.DBA.PROJ_ACT_IRI ( in proj_no varchar, in act_no integer, in ac_st_date date ) returns varchar, function DB.DBA.PROJ_ACT_IRI_INV_1 (in proj_act_iri varchar) returns varchar , function DB.DBA.PROJ_ACT_IRI_INV_2 (in proj_act_iri varchar) returns integer , function DB.DBA.PROJ_ACT_IRI_INV_3 (in proj_act_iri varchar) returns date option (bijection, returns "http://localhost:8890/db2sample/proj_act/%s_%s_%s#this") . create iri class <http://localhost:8890/schemas/db2sample/project_iri> "http://localhost:8890/db2sample/project/%s#this" ( in proj_no varchar not null ) . ; SPARQL prefix opl: <http://localhost:8890/schemas/db2sample/> alter quad storage virtrdf:DefaultQuadStorage from DB.db2sample.ACT as act_tbl from DB.db2sample.DEPARTMENT as dept_tbl from DB.db2sample.EMPLOYEE as emp_tbl from DB.db2sample.EMPPROJACT as emp_proj_act_tbl from DB.db2sample.EMP_RESUME as emp_resume_tbl from DB.db2sample.PROJACT as proj_act_tbl from DB.db2sample.PROJECT as project_tbl { create virtrdf:db2sample as graph <http://localhost:8890/db2sample> { opl:act_iri(act_tbl.ACTNO) a opl:Act as virtrdf:act_id ; opl:act_no act_tbl.ACTNO as virtrdf:act_act_no ; opl:act_kwd act_tbl.ACTKWD as virtrdf:act_act_kwd ; opl:act_desc act_tbl.ACTDESC as virtrdf:act_act_desc . opl:department_iri(dept_tbl.DEPTNO) a opl:Department as virtrdf:dept_id ; opl:dept_no dept_tbl.DEPTNO as virtrdf:dept_dept_no ; opl:dept_name dept_tbl.DEPTNAME as virtrdf:dept_dept_name ; opl:dept_manager opl:employee_iri(dept_tbl.MGRNO) as virtrdf:dept_mgr_no ; opl:supervising_dept opl:department_iri(dept_tbl.ADMRDEPT) as virtrdf:dept_supervising_dept ; opl:location dept_tbl.LOCATION as virtrdf:dept_location ; opl:employee_collection opl:employee_iri(emp_tbl.EMPNO) where (^{emp_tbl.}^.WORKDEPT = ^{dept_tbl.}^.DEPTNO) as virtrdf:dept_employee_collection ; opl:dept_project_collection opl:project_iri(project_tbl.PROJNO) where (^{project_tbl.}^.DEPTNO = ^{dept_tbl.}^.DEPTNO) as virtrdf:dept_project_collection . opl:employee_iri(emp_tbl.EMPNO) a opl:Employee as virtrdf:employee_id ; opl:emp_no emp_tbl.EMPNO as virtrdf:employee_emp_no ; opl:first_name emp_tbl.FIRSTNME as virtrdf:employee_first_name ; opl:middle_initial emp_tbl.MIDINIT as virtrdf:employee_middle_initial ; opl:last_name emp_tbl.LASTNAME as virtrdf:employee_last_name ; opl:work_dept opl:department_iri(emp_tbl.WORKDEPT) as virtrdf:employee_work_dept ; opl:phone_no emp_tbl.PHONENO as virtrdf:employee_phone_no ; opl:hire_date emp_tbl.HIREDATE as virtrdf:employee_hire_date ; opl:job emp_tbl.JOB as virtrdf:employee_job ; opl:education_level emp_tbl.EDLEVEL as virtrdf:employee_education_level ; opl:gender emp_tbl.SEX as virtrdf:employee_gender ; opl:date_of_birth emp_tbl.BIRTHDATE as virtrdf:employee_date_of_birth ; opl:salary emp_tbl.SALARY as virtrdf:employee_salary ; opl:bonus emp_tbl.BONUS as virtrdf:employee_bonus ; opl:commission emp_tbl.COMM as virtrdf:employee_commission ; opl:resume_collection opl:employee_resume_iri( emp_resume_tbl.EMPNO, emp_resume_tbl.RESUME_FORMAT ) where (^{emp_tbl.}^.EMPNO = ^{emp_resume_tbl.}^.EMPNO) as virtrdf:employee_resume_collection ; opl:projects_responsible_for_collection opl:project_iri(project_tbl.PROJNO) where (^{project_tbl.}^.RESPEMP = ^{emp_tbl.}^.EMPNO) as virtrdf:employee_projects_responsible_for_collection ; opl:activity_collection opl:emp_proj_act_iri( emp_proj_act_tbl.EMPNO, emp_proj_act_tbl.PROJNO, emp_proj_act_tbl.ACTNO, emp_proj_act_tbl.EMSTDATE ) where (^{emp_tbl.}^.EMPNO = ^{emp_proj_act_tbl.}^.EMPNO) as virtrdf:employee_activity_collection . opl:emp_proj_act_iri( emp_proj_act_tbl.EMPNO, emp_proj_act_tbl.PROJNO, emp_proj_act_tbl.ACTNO, emp_proj_act_tbl.EMSTDATE ) a opl:EmpProjAct as virtrdf:empprojact_id ; opl:epa_emp_no emp_proj_act_tbl.EMPNO as virtrdf:empprojact_emp_no ; opl:epa_proj_no emp_proj_act_tbl.PROJNO as virtrdf:empprojact_proj_no ; opl:epa_act_no emp_proj_act_tbl.ACTNO as virtrdf:empprojact_act_no ; opl:emp_start_date emp_proj_act_tbl.EMSTDATE as virtrdf:empprojact_emp_start_date ; opl:emp_time emp_proj_act_tbl.EMPTIME as virtrdf:empprojact_emp_time ; opl:emp_end_date emp_proj_act_tbl.EMENDATE as virtrdf:empprojact_emp_end_date ; opl:assigned_to opl:employee_iri(emp_proj_act_tbl.EMPNO) as virtrdf:empprojact_assigned_to ; opl:project_activity opl:proj_act_iri( emp_proj_act_tbl.PROJNO, emp_proj_act_tbl.ACTNO, emp_proj_act_tbl.EMSTDATE ) as virtrdf:empprojact_project_activity . opl:employee_resume_iri( emp_resume_tbl.EMPNO, emp_resume_tbl.RESUME_FORMAT ) a opl:EmployeeResume as virtrdf:employee_resume_id ; opl:er_emp_no emp_resume_tbl.EMPNO as virtrdf:employee_resume_emp_no ; opl:resume_format emp_resume_tbl.RESUME_FORMAT as virtrdf:employee_resume_resume_format ; opl:resume emp_resume_tbl.RESUME as virtrdf:employee_resume_resume ; opl:resume_of opl:employee_iri(emp_resume_tbl.EMPNO) as virtrdf:employee_resume_resume_of . opl:proj_act_iri( proj_act_tbl.PROJNO, proj_act_tbl.ACTNO, proj_act_tbl.ACSTDATE ) a opl:ProjAct as virtrdf:projact_id; opl:pa_proj_no proj_act_tbl.PROJNO as virtrdf:projact_proj_no ; opl:pa_act_no proj_act_tbl.ACTNO as virtrdf:projact_act_no ; opl:ac_st_date proj_act_tbl.ACSTDATE as virtrdf:projact_ac_st_date ; opl:ac_staff proj_act_tbl.ACSTAFF as virtrdf:projact_ac_staff ; opl:ac_en_date proj_act_tbl.ACENDATE as virtrdf:projact_ac_en_date ; opl:project opl:project_iri(proj_act_tbl.PROJNO) as virtrdf:projact_project ; opl:activity opl:act_iri(proj_act_tbl.ACTNO) as virtrdf:projact_activity ; opl:employee_activity_collection opl:emp_proj_act_iri( emp_proj_act_tbl.EMPNO, emp_proj_act_tbl.PROJNO, emp_proj_act_tbl.ACTNO, emp_proj_act_tbl.EMSTDATE ) where ( ^{proj_act_tbl.}^.PROJNO = ^{emp_proj_act_tbl.}^.PROJNO AND ^{proj_act_tbl.}^.ACTNO = ^{emp_proj_act_tbl.}^.ACTNO AND ^{proj_act_tbl.}^.ACSTDATE = ^{emp_proj_act_tbl.}^.EMSTDATE ) as virtrdf:project_employee_activity_collection . opl:project_iri(project_tbl.PROJNO) a opl:Project as virtrdf:project_id ; opl:proj_no project_tbl.PROJNO as virtrdf:project_proj_no ; opl:proj_name project_tbl.PROJNAME as virtrdf:project_proj_name ; opl:is_project_of_department opl:department_iri(project_tbl.DEPTNO) as virtrdf:project_is_project_of_department ; opl:resp_emp opl:employee_iri(project_tbl.RESPEMP) as virtrdf:project_resp_emp ; opl:pr_staff project_tbl.PRSTAFF as virtrdf:project_pr_staff ; opl:pr_st_date project_tbl.PRSTDATE as virtrdf:project_pr_st_date ; opl:pr_en_date project_tbl.PRENDATE as virtrdf:project_pr_en_date ; opl:maj_proj project_tbl.MAJPROJ as virtrdf:project_maj_proj ; opl:proj_activity_collection opl:proj_act_iri( proj_act_tbl.PROJNO, proj_act_tbl.ACTNO, proj_act_tbl.ACSTDATE ) where (^{project_tbl.}^.PROJNO = ^{proj_act_tbl.}^.PROJNO) as virtrdf:project_activity_collection . } . } . ; delete from db.dba.url_rewrite_rule_list where urrl_list like 'db2sample_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'db2sample_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'db2sample_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/localhost:8890%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'db2sample_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=DESCRIBE+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+FROM+%%3Chttp%%3A//localhost%%3A8890/db2sample%%3E&format=%U', vector('path','path','*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'db2sample_rule_list1', 1, vector ( 'db2sample_rule1', 'db2sample_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/db2sample'); VHOST_DEFINE ( lpath=>'/db2sample', ppath=>'/DAV/db2sample/', vsp_user=>'dba', is_dav=>1, is_brws=>0, opts=>vector ('url_rewrite', 'db2sample_rule_list1') ); delete from db.dba.url_rewrite_rule_list where urrl_list like 'db2sample_schema_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'db2sample_schema_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'db2sample_schema_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/localhost:8890%U', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'db2sample_schema_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}%%0D%%0AFROM+%%3Chttp%%3A//localhost%%3A8890/schemas/db2sample%%3E+%%0D%%0AWHERE+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path','path','*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'db2sample_schema_rule_list1', 1, vector ( 'db2sample_schema_rule1', 'db2sample_schema_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/schemas/db2sample'); VHOST_DEFINE ( lpath=>'/schemas/db2sample', ppath=>'/DAV/schemas_db2sample/', vsp_user=>'dba', is_dav=>1, is_brws=>0, opts=>vector ('url_rewrite', 'db2sample_schema_rule_list1') );
DB..vd_remote_data_source ('inf10_stores_demo_rdf', '', '<uid>','<pwd>'); ATTACH TABLE "informix"."call_type" PRIMARY KEY ("call_code") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."call_type" FROM 'inf10_stores_demo_rdf'; ATTACH TABLE "informix"."catalog" PRIMARY KEY ("catalog_num") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."catalog" FROM 'inf10_stores_demo_rdf'; ATTACH TABLE "informix"."cust_calls" PRIMARY KEY ("customer_num", "call_dtime") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."cust_calls" FROM 'inf10_stores_demo_rdf'; ATTACH TABLE "informix"."customer" PRIMARY KEY ("customer_num") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."customer" FROM 'inf10_stores_demo_rdf'; ATTACH TABLE "informix"."items" PRIMARY KEY ("item_num", "order_num") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."items" FROM 'inf10_stores_demo_rdf'; ATTACH TABLE "informix"."manufact" PRIMARY KEY ("manu_code") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."manufact" FROM 'inf10_stores_demo_rdf'; ATTACH TABLE "informix"."msgs" PRIMARY KEY ("lang", "number", "message") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."msgs" FROM 'inf10_stores_demo_rdf'; ATTACH TABLE "informix"."orders" PRIMARY KEY ("order_num") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."orders" FROM 'inf10_stores_demo_rdf'; ATTACH TABLE "informix"."state" PRIMARY KEY ("code", "sname") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."state" FROM 'inf10_stores_demo_rdf'; ATTACH TABLE "informix"."stock" PRIMARY KEY ("stock_num", "manu_code") AS "stores_demo_rdf"."inf10_stores_demo_rdf"."stock" FROM 'inf10_stores_demo_rdf'; COMMIT WORK; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.items TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.catalog TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.msgs TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.state TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.orders TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.stock TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.customer TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.call_type TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.manufact TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON stores_demo_rdf.inf10_stores_demo_rdf.cust_calls TO "SPARQL", "SPARQL_UPDATE"; GRANT SPARQL_UPDATE to "SPARQL"; create function DB.DBA.CUST_CALLS_IRI (in customer_num integer, in call_dtime datetime) returns varchar { declare _call_dtime any; _call_dtime := cast(call_dtime as varchar); return sprintf('http://localhost:8890/informix/stores_demo/cust_calls/%d_%U#this', customer_num, _call_dtime); }; create function DB.DBA.CUST_CALLS_IRI_INV_1 (in cust_calls_iri varchar) returns integer { declare parts any; parts := sprintf_inverse(cust_calls_iri, 'http://localhost:8890/informix/stores_demo/cust_calls/%d_%U#this', 1); if(parts is not null) { return parts[0]; } return NULL; }; create function DB.DBA.CUST_CALLS_IRI_INV_2 (in cust_calls_iri varchar) returns datetime { declare parts any; parts := sprintf_inverse(cust_calls_iri, 'http://localhost:8890/informix/stores_demo/cust_calls/%d_%U#this', 1); if(parts is not null) { return parts[1]; } return NULL; }; grant execute on DB.DBA.CUST_CALLS_IRI to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.CUST_CALLS_IRI_INV_1 to "SPARQL", "SPARQL_UPDATE"; grant execute on DB.DBA.CUST_CALLS_IRI_INV_2 to "SPARQL", "SPARQL_UPDATE"; -------- Create rdfs:Class definitions ---------------------------- ttlp ( ' @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix items: <http://localhost:8890/schemas/informix/stores_demo/items/> . @prefix catalog: <http://localhost:8890/schemas/informix/stores_demo/catalog/> . @prefix stock: <http://localhost:8890/schemas/informix/stores_demo/stock/> . @prefix msgs: <http://localhost:8890/schemas/informix/stores_demo/msgs/> . @prefix state: <http://localhost:8890/schemas/informix/stores_demo/state/> . @prefix orders: <http://localhost:8890/schemas/informix/stores_demo/orders/> . @prefix manuf: <http://localhost:8890/schemas/informix/stores_demo/manufact/> . @prefix cust: <http://localhost:8890/schemas/informix/stores_demo/customer/> . @prefix callt: <http://localhost:8890/schemas/informix/stores_demo/call_type/> . @prefix custc: <http://localhost:8890/schemas/informix/stores_demo/cust_calls/> . items:Items a rdfs:Class ; rdfs:label "Items" ; rdfs:comment "Informix SD items table" . items:item_num a rdf:Property ; rdfs:domain items:Items ; rdfs:range xsd:integer ; rdfs:label "ITEM NUMBER" . items:quantity a rdf:Property ; rdfs:domain items:Items ; rdfs:range xsd:integer ; rdfs:label "QUANTITY" . items:total_price a rdf:Property ; rdfs:domain items:Items ; rdfs:range xsd:decimal ; rdfs:label "TOTAL PRICE" . items:order_num_fk a rdf:Property ; rdfs:domain items:Items ; rdfs:range orders:Orders ; rdfs:label "ORDER NUMBER" . items:stock_num_fk a rdf:Property ; rdfs:domain items:Items ; rdfs:range stock:Stock ; rdfs:label "STOCK NUMBER" . items:manu_code_fk a rdf:Property ; rdfs:domain items:Items ; rdfs:range stock:Stock ; rdfs:label "MANUAL CODE" . catalog:Catalog a rdfs:Class ; rdfs:label "Catalog" ; rdfs:comment "Informix SD catalog table" . catalog:manu_code a rdf:Property ; rdfs:domain catalog:Catalog ; rdfs:range xsd:integer ; rdfs:label "MANUAL CODE" . catalog:cat_descr a rdf:Property ; rdfs:domain catalog:Catalog ; rdfs:range xsd:string ; rdfs:label "CATALOG DESCRIPTION" . catalog:cat_picture a rdf:Property ; rdfs:domain catalog:Catalog ; rdfs:range xsd:byte ; rdfs:label "CATALOG PICTURE" . catalog:cat_advert a rdf:Property ; rdfs:domain catalog:Catalog ; rdfs:range xsd:string ; rdfs:label "CATALOG ADVERT" . catalog:catalog_num_fk a rdf:Property ; rdfs:domain catalog:Catalog ; rdfs:range stock:Stock ; rdfs:label "CATALOG NUMBER" . catalog:stock_num_fk a rdf:Property ; rdfs:domain catalog:Catalog ; rdfs:range stock:Stock ; rdfs:label "STOCK NUMBER" . msgs:Msgs a rdfs:Class ; rdfs:label "Msgs" ; rdfs:comment "Informix SD msgs table" . msgs:lang a rdf:Property ; rdfs:domain msgs:Msgs ; rdfs:range xsd:string ; rdfs:label "LANGUAGE" . msgs:number a rdf:Property ; rdfs:domain msgs:Msgs ; rdfs:range xsd:integer ; rdfs:label "NUMBER" . msgs:message a rdf:Property ; rdfs:domain msgs:Msgs ; rdfs:range xsd:string ; rdfs:label "MESSAGE" . state:State a rdfs:Class ; rdfs:label "State" ; rdfs:comment "Informix SD state table" . state:code a rdf:Property ; rdfs:domain state:State ; rdfs:range xsd:string ; rdfs:label "STATE CODE" . state:sname a rdf:Property ; rdfs:domain state:State ; rdfs:range xsd:string ; rdfs:label "STATE NAME" . orders:Orders a rdfs:Class ; rdfs:label "Orders" ; rdfs:comment "Informix SD orders table" . orders:order_num a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range xsd:integer ; rdfs:label "ORDER NUMBER" . orders:order_date a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range xsd:date ; rdfs:label "ORDER DATE" . orders:ship_instruct a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range xsd:string ; rdfs:label "SHIPPING INSTRUCTION" . orders:backlog a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range xsd:string ; rdfs:label "BACKLOG" . orders:po_num a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range xsd:string ; rdfs:label "PURCHASE ORDER NUMBER" . orders:ship_date a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range xsd:date ; rdfs:label "SHIPPING DATE" . orders:ship_weight a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range xsd:decimal ; rdfs:label "SHIPPING WEIGHT" . orders:ship_charge a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range xsd:decimal ; rdfs:label "SHIPPING CHARGE" . orders:paid_date a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range xsd:date ; rdfs:label "PAID DATE" . orders:customer_num_fk a rdf:Property ; rdfs:domain orders:Orders ; rdfs:range cust:Customer ; rdfs:label "CUSTOMER NUMBER" . stock:Stock a rdfs:Class ; rdfs:label "Stock" ; rdfs:comment "Informix SD stock table" . stock:stock_num a rdf:Property ; rdfs:domain stock:Stock ; rdfs:range xsd:integer ; rdfs:label "STOCK NUMBER" . stock:description a rdf:Property ; rdfs:domain stock:Stock ; rdfs:range xsd:string ; rdfs:label "DESCRIPTION" . stock:unit_price a rdf:Property ; rdfs:domain stock:Stock ; rdfs:range xsd:decimal ; rdfs:label "UNIT PRICE" . stock:unit a rdf:Property ; rdfs:domain stock:Stock ; rdfs:range xsd:string ; rdfs:label "UNIT" . stock:unit_descr a rdf:Property ; rdfs:domain stock:Stock ; rdfs:range xsd:decimal ; rdfs:label "UNIT DESCRIPTION" . stock:manu_code_fk a rdf:Property ; rdfs:domain stock:Stock ; rdfs:range manuf:Manufact ; rdfs:label "MANUAL CODE" . cust:Customer a rdfs:Class ; rdfs:label "Customer" ; rdfs:comment "Informix SD customer table" . cust:customer_num a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:integer ; rdfs:label "CUSTOMER NUMBER" . cust:fname a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:string ; rdfs:label "FIRST NAME" . cust:lname a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:string ; rdfs:label "LAST NAME" . cust:company a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:string ; rdfs:label "COMPANY" . cust:address1 a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:string ; rdfs:label "ADDRESS1" . cust:address2 a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:string ; rdfs:label "ADDRESS2" . cust:city a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:string ; rdfs:label "CITY" . cust:state a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:string ; rdfs:label "STATE" . cust:zipcode a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:string ; rdfs:label "ZIP CODE" . cust:phone a rdf:Property ; rdfs:domain cust:Customer ; rdfs:range xsd:string ; rdfs:label "PHONE NUMBER" . callt:Call_type a rdfs:Class ; rdfs:label "Call_type" ; rdfs:comment "Informix SD call_type table" . callt:call_code a rdf:Property ; rdfs:domain callt:Call_type ; rdfs:range xsd:string ; rdfs:label "CALL CODE" . callt:code_descr a rdf:Property ; rdfs:domain callt:Call_type ; rdfs:range xsd:string ; rdfs:label "CODE DESCRIPTION" . manuf:Manufact a rdfs:Class ; rdfs:label "Manufact" ; rdfs:comment "Informix SD manufact table" . manuf:manu_code a rdf:Property ; rdfs:domain manuf:Manufact ; rdfs:range xsd:string ; rdfs:label "MANUFACTURE CODE" . manuf:manu_name a rdf:Property ; rdfs:domain manuf:Manufact ; rdfs:range xsd:string ; rdfs:label "MANUFACTURE NAME" . manuf:lead_time a rdf:Property ; rdfs:domain manuf:Manufact ; rdfs:range xsd:integer ; rdfs:label "LEAD TIME" . custc:Cust_calls a rdfs:Class ; rdfs:label "Cust_calls" ; rdfs:comment "Informix SD cust_calls table" . custc:call_dtime a rdf:Property ; rdfs:domain manuf:Cust_calls ; rdfs:range xsd:datetime ; rdfs:label "CALL TIME" . custc:user_id a rdf:Property ; rdfs:domain manuf:Cust_calls ; rdfs:range xsd:string ; rdfs:label "USER ID" . custc:call_descr a rdf:Property ; rdfs:domain manuf:Cust_calls ; rdfs:range xsd:string ; rdfs:label "CALL DESCRIPTION" . custc:res_dtime a rdf:Property ; rdfs:domain manuf:Cust_calls ; rdfs:range xsd:datetime ; rdfs:label "RES TIME" . custc:res_descr a rdf:Property ; rdfs:domain manuf:Cust_calls ; rdfs:range xsd:string ; rdfs:label "RES DESCRIPTION" . custc:customer_num_fk a rdf:Property ; rdfs:domain manuf:Cust_calls ; rdfs:range cust:Customer ; rdfs:label "CUSTOMER NUM" . custc:call_code_fk a rdf:Property ; rdfs:domain manuf:Cust_calls ; rdfs:range callt:Call_type ; rdfs:label "CALL CODE" . ', '', 'http://localhost:8890/schemas/informix/stores_demo', 0); ----------- Create IRI Classes ------------- SPARQL prefix items: <http://localhost:8890/schemas/informix/stores_demo/items/> prefix catalog: <http://localhost:8890/schemas/informix/stores_demo/catalog/> prefix stock: <http://localhost:8890/schemas/informix/stores_demo/stock/> prefix msgs: <http://localhost:8890/schemas/informix/stores_demo/msgs/> prefix state: <http://localhost:8890/schemas/informix/stores_demo/state/> prefix orders: <http://localhost:8890/schemas/informix/stores_demo/orders/> prefix manuf: <http://localhost:8890/schemas/informix/stores_demo/manufact/> prefix cust: <http://localhost:8890/schemas/informix/stores_demo/customer/> prefix callt: <http://localhost:8890/schemas/informix/stores_demo/call_type/> prefix custc: <http://localhost:8890/schemas/informix/stores_demo/cust_calls/> create iri class items:items_iri "http://localhost:8890/informix/stores_demo/items/%d_%d#this" (in item_num integer not null, in order_num integer not null) . create iri class catalog:catalog_iri "http://localhost:8890/informix/stores_demo/catalog/%d#this" (in catalog_num integer not null) . create iri class msgs:msgs_iri "http://localhost:8890/informix/stores_demo/msgs/%U_%d_%U#this" (in _lang varchar not null, in number integer not null, in message varchar not null) . create iri class state:state_iri "http://localhost:8890/informix/stores_demo/state/%U#this" (in code varchar not null) . create iri class orders:orders_iri "http://localhost:8890/informix/stores_demo/orders/%d#this" (in order_num integer not null) . create iri class stock:stock_iri "http://localhost:8890/informix/stores_demo/stock/%d_%U#this" (in stock_num integer not null, in manu_code varchar not null) . create iri class cust:customer_iri "http://localhost:8890/informix/stores_demo/customer/%d#this" (in customer_num integer not null) . create iri class callt:call_type_iri "http://localhost:8890/informix/stores_demo/call_type/%U#this" (in call_code varchar not null) . create iri class manuf:manufact_iri "http://localhost:8890/informix/stores_demo/manufact/%U#this" (in manu_code varchar not null) . create iri class custc:cust_calls_iri using function DB.DBA.CUST_CALLS_IRI (in customer_num integer, in call_dtime datetime) returns varchar, function DB.DBA.CUST_CALLS_IRI_INV_1 (in cust_calls_iri varchar) returns integer, function DB.DBA.CUST_CALLS_IRI_INV_2 (in cust_calls_iri varchar) returns datetime . ; ------------- Create Quad Store ------------------------------------ SPARQL prefix items: <http://localhost:8890/schemas/informix/stores_demo/items/> prefix catalog: <http://localhost:8890/schemas/informix/stores_demo/catalog/> prefix stock: <http://localhost:8890/schemas/informix/stores_demo/stock/> prefix msgs: <http://localhost:8890/schemas/informix/stores_demo/msgs/> prefix state: <http://localhost:8890/schemas/informix/stores_demo/state/> prefix orders: <http://localhost:8890/schemas/informix/stores_demo/orders/> prefix manuf: <http://localhost:8890/schemas/informix/stores_demo/manufact/> prefix cust: <http://localhost:8890/schemas/informix/stores_demo/customer/> prefix callt: <http://localhost:8890/schemas/informix/stores_demo/call_type/> prefix custc: <http://localhost:8890/schemas/informix/stores_demo/cust_calls/> alter quad storage virtrdf:DefaultQuadStorage from stores_demo_rdf.inf10_stores_demo_rdf.items as items_tbl from stores_demo_rdf.inf10_stores_demo_rdf.catalog as catalog_tbl from stores_demo_rdf.inf10_stores_demo_rdf.msgs as msgs_tbl from stores_demo_rdf.inf10_stores_demo_rdf.state as state_tbl from stores_demo_rdf.inf10_stores_demo_rdf.orders as orders_tbl from stores_demo_rdf.inf10_stores_demo_rdf.stock as stock_tbl from stores_demo_rdf.inf10_stores_demo_rdf.customer as customer_tbl from stores_demo_rdf.inf10_stores_demo_rdf.call_type as call_type_tbl from stores_demo_rdf.inf10_stores_demo_rdf.manufact as manufact_tbl from stores_demo_rdf.inf10_stores_demo_rdf.cust_calls as cust_calls_tbl { create virtrdf:informix_stores_demo as graph <http://localhost:8890/informix/stores_demo> { items:items_iri (items_tbl.item_num, items_tbl.order_num) a items:Items as virtrdf:items_pk ; items:item_num items_tbl.item_num as virtrdf:items_item_num ; items:order_num items_tbl.order_num as virtrdf:items_order_num ; items:stock_num items_tbl.stock_num as virtrdf:items_stock_num ; items:manu_code items_tbl.manu_code as virtrdf:items_manu_code ; items:quantity items_tbl.quantity as virtrdf:items_quantity ; items:total_price items_tbl.total_price as virtrdf:items_total_price ; items:from_order orders:orders_iri (orders_tbl.order_num) where (^{items_tbl.}^.order_num = ^{orders_tbl.}^.order_num) as virtrdf:Items-from_order ; items:has_stock stock:stock_iri (stock_tbl.stock_num, stock_tbl.manu_code) where (^{items_tbl.}^.stock_num = ^{stock_tbl.}^.stock_num and ^{items_tbl.}^.manu_code = ^{stock_tbl.}^.manu_code) as virtrdf:Item-has_stock . catalog:catalog_iri (catalog_tbl.catalog_num) a catalog:Catalog as virtrdf:catalog_num; catalog:stock_num catalog_tbl.stock_num as virtrdf:catalog_stock_num ; catalog:manu_code catalog_tbl.manu_code as virtrdf:catalog_manu_code ; catalog:cat_descr catalog_tbl.cat_descr as virtrdf:catalog_cat_descr ; catalog:cat_picture catalog_tbl.cat_picture as virtrdf:catalog_cat_picture ; catalog:cat_advert catalog_tbl.cat_advert as virtrdf:catalog_cat_advert ; catalog:has_stock stock:stock_iri (stock_tbl.stock_num, stock_tbl.manu_code) where (^{catalog_tbl.}^.stock_num = ^{stock_tbl.}^.stock_num and ^{catalog_tbl.}^.manu_code = ^{stock_tbl.}^.manu_code) as virtrdf:Catalog-has_stock . msgs:msgs_iri (msgs_tbl.lang, msgs_tbl.number, msgs_tbl.message) a msgs:Msgs as virtrdf:msgs_pk ; msgs:lang msgs_tbl.lang as virtrdf:msgs_lang ; msgs:number msgs_tbl.number as virtrdf:msgs_number ; msgs:message msgs_tbl.message as virtrdf:msgs_message . state:state_iri (state_tbl.code) a state:State as virtrdf:code ; state:code state_tbl.code as virtrdf:state_code ; state:sname state_tbl.sname as virtrdf:state_sname . orders:orders_iri (orders_tbl.order_num) a orders:Orders as virtrdf:order_num ; orders:order_num orders_tbl.order_num as virtrdf:orders_order_num ; orders:order_date orders_tbl.order_date as virtrdf:orders_order_date ; orders:customer_num orders_tbl.customer_num as virtrdf:orders_customer_num ; orders:ship_instruct orders_tbl.ship_instruct as virtrdf:orders_ship_instruct ; orders:backlog orders_tbl.backlog as virtrdf:orders_backlog ; orders:po_num orders_tbl.po_num as virtrdf:orders_po_num ; orders:ship_date orders_tbl.ship_date as virtrdf:orders_ship_date ; orders:ship_weight orders_tbl.ship_weight as virtrdf:orders_ship_weight ; orders:ship_charge orders_tbl.ship_charge as virtrdf:orders_ship_charge ; orders:paid_date orders_tbl.paid_date as virtrdf:orders_paid_date ; orders:has_customer cust:customer_iri (customer_tbl.customer_num) where (^{orders_tbl.}^.customer_num = ^{customer_tbl.}^.customer_num) as virtrdf:Orders-has_customer ; orders:has_item items:items_iri (items_tbl.item_num, items_tbl.order_num) where (^{orders_tbl.}^.order_num = ^{items_tbl.}^.order_num) as virtrdf:Orders-has_item . stock:stock_iri (stock_tbl.stock_num, stock_tbl.manu_code) a stock:Stock as virtrdf:stock_pk ; stock:stock_num stock_tbl.stock_num as virtrdf:stock_stock_num ; stock:manu_code stock_tbl.manu_code as virtrdf:stock_manu_code ; stock:description stock_tbl.description as virtrdf:stock_description ; stock:unit_price stock_tbl.unit_price as virtrdf:stock_unit_price ; stock:unit stock_tbl.unit as virtrdf:stock_unit ; stock:unit_descr stock_tbl.unit_descr as virtrdf:stock_unit_descr ; stock:manufactured_by manuf:manufact_iri (manufact_tbl.manu_code) where (^{stock_tbl.}^.manu_code = ^{manufact_tbl.}^.manu_code) as virtrdf:Stock-manufactured_by ; stock:in_catalog catalog:catalog_iri (catalog_tbl.catalog_num) where (^{stock_tbl.}^.stock_num = ^{catalog_tbl.}^.stock_num and ^{stock_tbl.}^.manu_code = ^{catalog_tbl.}^.manu_code) as virtrdf:Stock-in_catalog ; stock:in_item items:items_iri (items_tbl.item_num, items_tbl.order_num) where (^{stock_tbl.}^.stock_num = ^{items_tbl.}^.stock_num and ^{stock_tbl.}^.manu_code = ^{items_tbl.}^.manu_code) as virtrdf:Stock-in_items . cust:customer_iri (customer_tbl.customer_num) a cust:Customer as virtrdf:customer_num ; cust:customer_num customer_tbl.customer_num as virtrdf:customer_customer_num ; cust:fname customer_tbl.fname as virtrdf:customer_fname ; cust:lname customer_tbl.lname as virtrdf:customer_lname ; cust:company customer_tbl.company as virtrdf:customer_company ; cust:address1 customer_tbl.address1 as virtrdf:customer_address1 ; cust:address2 customer_tbl.address2 as virtrdf:customer_address2 ; cust:city customer_tbl.city as virtrdf:customer_city ; cust:state customer_tbl.state as virtrdf:customer_state ; cust:zipcode customer_tbl.zipcode as virtrdf:customer_zipcode ; cust:phone customer_tbl.phone as virtrdf:customer_phone ; cust:placed_order orders:orders_iri (orders_tbl.order_num) where (^{customer_tbl.}^.customer_num = ^{orders_tbl.}^.customer_num) as virtrdf:Customer-placed_order ; cust:made_call custc:cust_calls_iri (cust_calls_tbl.customer_num, cust_calls_tbl.call_dtime ) where (^{customer_tbl.}^.customer_num = ^{cust_calls_tbl.}^.customer_num) as virtrdf:Cust_calls-made_call . callt:call_type_iri (call_type_tbl.call_code) a callt:Call_type as virtrdf:call_code ; callt:call_code call_type_tbl.call_code as virtrdf:call_type_call_code ; callt:code_descr call_type_tbl.code_descr as virtrdf:call_type_code_descr ; callt:call_is_type custc:cust_calls_iri (cust_calls_tbl.customer_num, cust_calls_tbl.call_dtime) where (^{call_type_tbl.}^.call_code = ^{cust_calls_tbl.}^.call_code) as virtrdf:Call_type-call_is_type . manuf:manufact_iri (manufact_tbl.manu_code) a manuf:Manufact as virtrdf:manu_code ; manuf:manu_code manufact_tbl.manu_code as virtrdf:manufact_tbl_manu_code ; manuf:manu_name manufact_tbl.manu_name as virtrdf:manufact_tbl_manu_name ; manuf:lead_time manufact_tbl.lead_time as virtrdf:manufact_tbl_lead_time ; manuf:manufactures stock:stock_iri (stock_tbl.stock_num, stock_tbl.manu_code) where (^{manufact_tbl.}^.manu_code = ^{stock_tbl.}^.manu_code) as virtrdf:Manufact-manufactures . custc:cust_calls_iri (cust_calls_tbl.customer_num, cust_calls_tbl.call_dtime) a custc:Cust_calls as virtrdf:cust_calls_pk ; custc:user_id cust_calls_tbl.user_id as virtrdf:cust_calls_user_id ; custc:call_code cust_calls_tbl.call_code as virtrdf:cust_calls_call_code ; custc:call_descr cust_calls_tbl.call_descr as virtrdf:cust_calls_call_descr ; custc:res_dtime cust_calls_tbl.res_dtime as virtrdf:cust_calls_res_dtime ; custc:res_descr cust_calls_tbl.res_descr as virtrdf:cust_calls_res_descr ; custc:made_by_customer cust:customer_iri (customer_tbl.customer_num) where (^{cust_calls_tbl.}^.customer_num = ^{customer_tbl.}^.customer_num) as virtrdf:Cust_calls-made_by_customer ; custc:is_call_type callt:call_type_iri (call_type_tbl.call_code) where (^{cust_calls_tbl.}^.call_code = ^{call_type_tbl.}^.call_code) as virtrdf:Cust_calls-is_call_type . } . } . ; delete from db.dba.url_rewrite_rule_list where urrl_list like 'informix_sd_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'informix_sd_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'informix_sd_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'informix_sd_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=DESCRIBE+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+FROM+%%3Chttp%%3A//localhost%%3A8890/informix/stores_demo%%3E&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'informix_sd_rule_list1', 1, vector ( 'informix_sd_rule1', 'informix_sd_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/informix/stores_demo'); VHOST_DEFINE ( lpath=>'/informix/stores_demo', ppath=>'/DAV/informix/stores_demo/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'informix_sd_rule_list1') ); delete from db.dba.url_rewrite_rule_list where urrl_list like 'informix_sd_schemas_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'informix_sd_schemas_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'informix_sd_schemas_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'informix_sd_schemas_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}%%0D%%0AFROM+%%3Chttp%%3A//localhost%%3A8890/schemas/informix/stores_demo%%3E+%%0D%%0AWHERE+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path','path','*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'informix_sd_schemas_rule_list1', 1, vector ( 'informix_sd_schemas_rule1', 'informix_sd_schemas_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/schemas/informix/stores_demo'); VHOST_DEFINE ( lpath=>'/schemas/informix/stores_demo', ppath=>'/DAV/schemas/informix/stores_demo/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'informix_sd_schemas_rule_list1') ); DB.DBA.XML_SET_NS_DECL ('items', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/items/', 2); DB.DBA.XML_SET_NS_DECL ('catalog', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/catalog/', 2); DB.DBA.XML_SET_NS_DECL ('stock', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/stock/', 2); DB.DBA.XML_SET_NS_DECL ('msgs', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/msgs/', 2); DB.DBA.XML_SET_NS_DECL ('state', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/state/', 2); DB.DBA.XML_SET_NS_DECL ('orders', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/orders/', 2); DB.DBA.XML_SET_NS_DECL ('manuf', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/manufact/', 2); DB.DBA.XML_SET_NS_DECL ('cust', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/customer/', 2); DB.DBA.XML_SET_NS_DECL ('callt', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/call_type/', 2); DB.DBA.XML_SET_NS_DECL ('custc', 'http://^{URIQADefaultHost}^/schemas/informix/stores_demo/cust_calls/', 2);
-- Setup script for RDF views of Ingres R3 Tutorial Sample Database -- DB..vd_remote_data_source ('ingiima-tut', '', '<uid>','<pwd>'); ATTACH TABLE "ingres"."book_list" PRIMARY KEY ("book_no") AS "TUT"."ingiima"."book_list" FROM 'ingiima-tut'; ATTACH TABLE "ingres"."book_orders" PRIMARY KEY ("order_no") AS "TUT"."ingiima"."book_orders" FROM 'ingiima-tut'; ATTACH TABLE "ingres"."cust_info" PRIMARY KEY ("cust_no") AS "TUT"."ingiima"."cust_info" FROM 'ingiima-tut'; ATTACH TABLE "ingres"."cust_orders" PRIMARY KEY ("order_no") AS "TUT"."ingiima"."cust_orders" FROM 'ingiima-tut'; COMMIT WORK; GRANT SELECT ON TUT.ingiima.book_list TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON TUT.ingiima.book_orders TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON TUT.ingiima.cust_info TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON TUT.ingiima.cust_orders TO "SPARQL", "SPARQL_UPDATE"; ------------------------------------------------------------------- -------- Create rdfs:Class definitions ---------------------------- ttlp ( ' @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix tut: <http://localhost:8890/schemas/ingrestut/> . tut:book_list a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/ingrestut> ; rdfs:label "book_list" ; rdfs:comment "Ingres Tutorial Database book_list table" . tut:book_no a rdf:Property ; rdfs:domain tut:book_list ; rdfs:range xsd:integer ; rdfs:label "Book No" . tut:title a rdf:Property ; rdfs:domain tut:book_list ; rdfs:range xsd:string ; rdfs:label "Title" . tut:author a rdf:Property ; rdfs:domain tut:book_list ; rdfs:range xsd:string ; rdfs:label "Author" . tut:price a rdf:Property ; rdfs:domain tut:book_list ; rdfs:range xsd:money; rdfs:label "Price" . tut:category a rdf:Property ; rdfs:domain tut:book_list ; rdfs:range xsd:string ; rdfs:label "Category" . tut:stock a rdf:Property ; rdfs:domain tut:book_list ; rdfs:range xsd:integer ; rdfs:label "Stock" . tut:dist_no a rdf:Property ; rdfs:domain tut:book_list ; rdfs:range xsd:integer ; rdfs:label "Dist No" . tut:book_orders a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/ingrestut> ; rdfs:label "Book Orders" ; rdfs:comment "Ingres Tutorial Database book_orders table" . tut:order_no a rdf:Property ; rdfs:domain tut:book_orders ; rdfs:range xsd:integer ; rdfs:label "Order No" . tut:book_no_no a rdf:Property ; rdfs:domain tut:book_orders ; rdfs:range tut:book_list ; rdfs:label "Book No" . tut:sale_price a rdf:Property ; rdfs:domain tut:book_orders ; rdfs:range xsd:money ; rdfs:label "Sale Price" . tut:quantity a rdf:Property ; rdfs:domain tut:book_orders ; rdfs:range xsd:integer ; rdfs:label "Quantity" . tut:extension a rdf:Property ; rdfs:domain tut:book_orders ; rdfs:range xsd:money ; rdfs:label "Extension" . tut:cust_info a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/ingrestut> ; rdfs:label "Customer Information" ; rdfs:comment "Ingres Tutorial Database cust_info table" . tut:cust_no a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:integer ; rdfs:label "Customer No" . tut:name a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string ; rdfs:label "Name" . tut:company a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string ; rdfs:label "Company" . tut:street a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string; rdfs:label "Street" . tut:city a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string; rdfs:label "City" . tut:state a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string; rdfs:label "State" . tut:city a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string; rdfs:label "City" . tut:state a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string; rdfs:label "State" . tut:zip a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string; rdfs:label "Zip Code" . tut:card_no a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string; rdfs:label "Card No" . tut:exp_date a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:date; rdfs:label "Expire Date" . tut:ship_to a rdf:Property ; rdfs:domain tut:cust_info ; rdfs:range xsd:string; rdfs:label "Ship To" . tut:cust_orders a rdfs:Class ; rdfs:isDefinedBy <http://localhost:8890/schemas/ingrestut> ; rdfs:label "Customer Orders" ; rdfs:comment "Ingres Tutorial Database cust_orders table" . tut:order_no a rdf:Property ; rdfs:domain tut:cust_orders ; rdfs:range tut:book_orders ; rdfs:label "Order No" . tut:book_no a rdf:Property ; rdfs:domain tut:cust_orders ; rdfs:range tut:cust_info ; rdfs:label "Book No" . tut:order_date a rdf:Property ; rdfs:domain tut:cust_orders ; rdfs:range xsd:date ; rdfs:label "Order Date" . tut:status a rdf:Property ; rdfs:domain tut:cust_orders ; rdfs:range xsd:string ; rdfs:label "Status" . tut:order_total a rdf:Property ; rdfs:domain tut:cust_orders ; rdfs:range xsd:money ; rdfs:label "Order Total" . ', '', 'http://localhost:8890/schemas/ingrestut', 0); --------------------------------------------------------------- ----------- Create IRI Classes ------------- SPARQL create iri class <http://localhost:8890/schemas/ingrestut/book_list_iri> "http://^{URIQADefaultHost}^/ingrestut/book_list/%d#this" (in book_no integer not null) . create iri class <http://localhost:8890/schemas/ingrestut/book_orders_iri> "http://^{URIQADefaultHost}^/ingrestut/book_orders/%d_%d#this" (in order_no integer not null, in book_no integer not null ) . create iri class <http://localhost:8890/schemas/ingrestut/cust_info_iri> "http://^{URIQADefaultHost}^/ingrestut/cust_info/%d#this" (in cust_no integer not null) . create iri class <http://localhost:8890/schemas/ingrestut/cust_orders_iri> "http://^{URIQADefaultHost}^/ingrestut/cust_orders/%d#this" (in order_no integer not null) . ; -------------------------------------------------------------------- ------------- Create Quad Store ------------------------------------ SPARQL prefix tut: <http://localhost:8890/schemas/ingrestut/> alter quad storage virtrdf:DefaultQuadStorage from TUT.ingiima.book_list as book_list_tbl from TUT.ingiima.book_orders as book_orders_tbl from TUT.ingiima.cust_info as cust_info_tbl from TUT.ingiima.cust_orders as cust_orders_tbl { create virtrdf:ingrestut as graph <http://localhost:8890/ingrestut> { tut:book_list_iri(book_list_tbl.book_no) a tut:book_list as virtrdf:book_list_book_no ; tut:title book_list_tbl.title as virtrdf:book_list_title; tut:author book_list_tbl.author as virtrdf:book_list_author; tut:price book_list_tbl.price as virtrdf:book_list_price; tut:category book_list_tbl.category as virtrdf:book_list_category; tut:stock book_list_tbl.stock as virtrdf:book_list_stock; tut:dist_no book_list_tbl.dist_no as virtrdf:book_list_dist_no . tut:book_orders_iri(book_orders_tbl.order_no, book_orders_tbl.book_no) a tut:book_orders as virtrdf:book_orders_pk; tut:order_no book_orders_tbl.order_no as virtrdf:book_orders_order_no; tut:book_no tut:book_list_iri(book_list_tbl.book_no) where(^{book_orders_tbl.}^.book_no = ^{book_list_tbl.}^.book_no) as virtrdf:book_orders_book_no; tut:sale_price book_orders_tbl.sale_price as virtrdf:book_orders_sale_price; tut:quantity book_orders_tbl.quantity as virtrdf:book_orders_quantity; tut:extension book_orders_tbl.extension as virtrdf:book_orders_extension . tut:cust_info_iri(cust_info_tbl.cust_no) a tut:cust_info as virtrdf:cust_info_cust_no; tut:name cust_info_tbl.name as virtrdf:cust_info_name; tut:company cust_info_tbl.company as virtrdf:cust_info_company; tut:street cust_info_tbl.street as virtrdf:cust_info_street; tut:city cust_info_tbl.city as virtrdf:cust_info_city; tut:state cust_info_tbl.state as virtrdf:cust_info_state; tut:zip cust_info_tbl.zip as virtrdf:cust_info_zip; tut:card_no cust_info_tbl.card_no as virtrdf:cust_info_card_no; tut:exp_date cust_info_tbl.exp_date as virtrdf:cust_info_exp_date; tut:ship_to cust_info_tbl.ship_to as virtrdf:cust_info_ship_to . tut:cust_orders_iri(cust_orders_tbl.order_no) a tut:cust_orders as virtrdf:cust_orders_order_no; tut:cust_no tut:cust_info_iri(cust_info_tbl.cust_no) where (^{cust_orders_tbl.}^.cust_no = ^{cust_info_tbl.}^.cust_no) as virtrdf:cust_orders_cust_no; tut:order_date cust_orders_tbl.order_date as virtrdf:cust_orders_order_date; tut:status cust_orders_tbl.status as virtrdf:cust_orders_status; tut:order_total cust_orders_tbl.order_total as virtrdf:cust_orders_order_total . } . } . ; delete from db.dba.url_rewrite_rule_list where urrl_list like 'ingrestut_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'ingrestut_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ingrestut_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ingrestut_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=DESCRIBE+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+FROM+%%3Chttp%%3A//localhost%%3A8890/ingrestut%%3E&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'ingrestut_rule_list1', 1, vector ( 'ingrestut_rule1', 'ingrestut_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/ingrestut'); VHOST_DEFINE ( lpath=>'/ingrestut', ppath=>'/DAV/ingrestut/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'ingrestut_rule_list1') ); delete from db.dba.url_rewrite_rule_list where urrl_list like 'ingres_schemas_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'ingres_schemas_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ingres_schemas_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'ingres_schemas_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}%%0D%%0AFROM+%%3Chttp%%3A//localhost%%3A8890/schemas/ingrestut%%3E+%%0D%%0AWHERE+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path','path','*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'ingres_schemas_rule_list1', 1, vector ( 'ingres_schemas_rule1', 'ingres_schemas_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/schema/ingrestut'); VHOST_DEFINE ( lpath=>'/schemas/ingrestut', ppath=>'/DAV/schemas/ingrestut/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'ingres_schemas_rule_list1') ); DB.DBA.XML_SET_NS_DECL ('tut', 'http://^{URIQADefaultHost}^/schemas/ingrestut/', 2);
ATTACH TABLE "ISPORTS_RDF"."Customer" PRIMARY KEY ("Cust-Num") AS "isports_rdf"."pro91_isports_rdf"."Customer" FROM 'pro91_isports_rdf'; ATTACH TABLE "ISPORTS_RDF"."Invoice" PRIMARY KEY ("Invoice-Num") AS "isports_rdf"."pro91_isports_rdf"."Invoice" FROM 'pro91_isports_rdf'; ATTACH TABLE "ISPORTS_RDF"."Item" PRIMARY KEY ("Item-num") AS "isports_rdf"."pro91_isports_rdf"."Item" FROM 'pro91_isports_rdf'; ATTACH TABLE "ISPORTS_RDF"."Local-Default" PRIMARY KEY ("Country") AS "isports_rdf"."pro91_isports_rdf"."Local-Default" FROM 'pro91_isports_rdf'; ATTACH TABLE "ISPORTS_RDF"."Order" PRIMARY KEY ("Order-num") AS "isports_rdf"."pro91_isports_rdf"."Order" FROM 'pro91_isports_rdf'; ATTACH TABLE "ISPORTS_RDF"."Order-Line" PRIMARY KEY ("Order-num", "Line-num") AS "isports_rdf"."pro91_isports_rdf"."Order-Line" FROM 'pro91_isports_rdf'; ATTACH TABLE "ISPORTS_RDF"."Ref-Call" PRIMARY KEY ("Call-Num") AS "isports_rdf"."pro91_isports_rdf"."Ref-Call" FROM 'pro91_isports_rdf'; ATTACH TABLE "ISPORTS_RDF"."Salesrep" PRIMARY KEY ("Sales-Rep") AS "isports_rdf"."pro91_isports_rdf"."Salesrep" FROM 'pro91_isports_rdf'; ATTACH TABLE "ISPORTS_RDF"."State" PRIMARY KEY ("State") AS "isports_rdf"."pro91_isports_rdf"."State" FROM 'pro91_isports_rdf'; COMMIT WORK; GRANT SELECT ON isports_rdf.pro91_isports_rdf.Customer TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf."Order" TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.Item TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf."Order-Line" TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.Invoice TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf."Local-Default" TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf."Ref-Call" TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.Salesrep TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.State TO "SPARQL", "SPARQL_UPDATE"; GRANT SPARQL_UPDATE to "SPARQL"; CREATE VIEW isports_rdf.pro91_isports_rdf.VCustomer AS SELECT "Cust-Num" AS Cust_Num, Name, Address, Address2, City, State, Country, Phone, Contact, "Sales-Rep" AS Sales_Rep, Comments, "Credit-Limit" AS Credit_Limit, Balance, Terms, Discount, "Postal-Code" AS Postal_Code FROM "isports_rdf"."pro91_isports_rdf"."Customer"; CREATE VIEW isports_rdf.pro91_isports_rdf.VOrder AS SELECT "Order-num" AS Order_num, "Cust-Num" AS Cust_Num, "Order-Date" AS Order_Date, "Ship-Date" AS Ship_Date, "Promise-Date" AS Promise_Date, Carrier, Instructions, PO, Terms, "Sales-Rep" AS Sales_Rep FROM isports_rdf.pro91_isports_rdf."Order"; CREATE VIEW isports_rdf.pro91_isports_rdf.VItem AS SELECT "Item-num" AS Item_num, "Item-Name" AS Item_Name, "Cat-Page" AS Cat_Page, Price, "Cat-Description" AS Cat_Description, "On-hand" AS On_hand, Allocated, "Re-Order" AS Re_Order, "On-Order" AS On_Order FROM isports_rdf.pro91_isports_rdf.Item; CREATE VIEW isports_rdf.pro91_isports_rdf.VOrder_Line AS SELECT "Order-num" AS Order_num, "Line-num" AS Line_num, "Item-num" AS Item_num, Price, Qty, Discount, "Extended-Price" AS Extended_Price, Backorder FROM isports_rdf.pro91_isports_rdf."Order-Line"; CREATE VIEW isports_rdf.pro91_isports_rdf.VInvoice AS SELECT "Invoice-Num" AS Invoice_Num, "Cust-Num" AS Cust_Num, "Invoice-Date" AS Invoice_Date, Amount, "Total-Paid" AS Total_Paid, Adjustment, "Order-Num" AS Order_Num, "Ship-Charge" AS Ship_Charge FROM isports_rdf.pro91_isports_rdf.Invoice; CREATE VIEW isports_rdf.pro91_isports_rdf.VLocal_Default AS SELECT Country, "Region1-Label" AS Region1_Label, "Region2-Label" AS Region2_Label, "Postal-Label" AS Postal_Label, "Postal-Format" AS Postal_Format, "Tel-Format" AS Tel_Format, "Date-Format" AS Date_Format, "Currency-Symbol" AS Currency_Symbol FROM isports_rdf.pro91_isports_rdf."Local-Default"; CREATE VIEW isports_rdf.pro91_isports_rdf.VRef_Call AS SELECT "Call-Num" AS Call_Num, "Cust-Num" AS Cust_Num, "Call-Date" AS Call_Date, "Sales-Rep" AS Sales_Rep, Parent, Txt FROM isports_rdf.pro91_isports_rdf."Ref-Call"; CREATE VIEW isports_rdf.pro91_isports_rdf.VSalesrep AS SELECT "Rep-Name" AS Rep_Name, Region, "Sales-Rep" AS Sales_Rep, "Month-Quota@1" AS Month_Quota_1, "Month-Quota@2" AS Month_Quota_2, "Month-Quota@3" AS Month_Quota_3, "Month-Quota@4" AS Month_Quota_4, "Month-Quota@5" AS Month_Quota_5, "Month-Quota@6" AS Month_Quota_6, "Month-Quota@7" AS Month_Quota_7, "Month-Quota@8" AS Month_Quota_8, "Month-Quota@9" AS Month_Quota_9, "Month-Quota@10" AS Month_Quota_10, "Month-Quota@11" AS Month_Quota_11, "Month-Quota@12" AS Month_Quota_12 FROM isports_rdf.pro91_isports_rdf.Salesrep; CREATE VIEW isports_rdf.pro91_isports_rdf.VState AS SELECT State, "State-Name" AS State_Name, Region FROM isports_rdf.pro91_isports_rdf.State; GRANT SELECT ON isports_rdf.pro91_isports_rdf.VCustomer TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.VOrder TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.VItem TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.VOrder_Line TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.VInvoice TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.VLocal_Default TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.VRef_Call TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.VSalesrep TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.pro91_isports_rdf.VState TO "SPARQL", "SPARQL_UPDATE"; -------- Create rdfs:Class definitions ---------------------------- ttlp ( ' @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix customer: <http://localhost:8890/schemas/progress/isports/customer/> . @prefix order: <http://localhost:8890/schemas/progress/isports/order/> . @prefix item: <http://localhost:8890/schemas/progress/isports/item/> . @prefix orderline: <http://localhost:8890/schemas/progress/isports/order_line/> . @prefix invoice: <http://localhost:8890/schemas/progress/isports/invoice/> . @prefix localdefault: <http://localhost:8890/schemas/progress/isports/local_default/> . @prefix refcall: <http://localhost:8890/schemas/progress/isports/ref_call/> . @prefix salesrep: <http://localhost:8890/schemas/progress/isports/salesrep/> . @prefix state: <http://localhost:8890/schemas/progress/isports/state/> . customer:Customer a rdfs:Class ; rdfs:label "Customer" ; rdfs:comment "Progress isports Customer table" . customer:Cust-Num a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:integer ; rdfs:label "Cust-Num" . customer:Name a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Name" . customer:Address a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Address" . customer:Address2 a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Address2" . customer:City a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "City" . customer:State a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "State" . customer:Country a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Country" . customer:Phone a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Phone" . customer:Contact a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Contact" . customer:Sales-Rep a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Sales-Rep" . customer:Comments a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Comments" . customer:Credit-Limit a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:decimal ; rdfs:label "Credit-Limit" . customer:Balance a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:decimal ; rdfs:label "Balance" . customer:Terms a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Terms" . customer:Discount a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:integer ; rdfs:label "Discount" . customer:Postal-Code a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Postal-Code" . order:Order a rdfs:Class ; rdfs:label "Order" ; rdfs:comment "Progress isports Order table" . order:Order-num a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:integer ; rdfs:label "Order-num" . order:Cust-Num a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:integer ; rdfs:label "Cust-Num" . order:Order-Date a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:date ; rdfs:label "Order-Date" . order:Ship-Date a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:date ; rdfs:label "Ship-Date" . order:Promise-Date a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:date ; rdfs:label "Promise-Date" . order:Carrier a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "Carrier" . order:Instructions a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "Instructions" . order:PO a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "PO" . order:Terms a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "Terms" . order:Sales-Rep a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "Sales-Rep" . item:Item a rdfs:Class ; rdfs:label "Item" ; rdfs:comment "Progress isports Item table" . item:Item-num a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "Item-num" . item:Item-Name a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:string ; rdfs:label "Item-Name" . item:Cat-Page a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "Cat-Page" . item:Price a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:decimal ; rdfs:label "Price" . item:Cat-Description a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:string ; rdfs:label "Cat-Description" . item:On-hand a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "On-hand" . item:Allocated a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "Allocated" . item:Re-Order a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "Re-Order" . item:On-Order a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "On-Order" . orderline:Order-Line a rdfs:Class ; rdfs:label "Order-Line" ; rdfs:comment "Progress isports Order-Line table" . orderline:Order-num a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Order-num" . orderline:Line-num a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Line-num" . orderline:Item-num a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Item-num" . orderline:Price a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:decimal ; rdfs:label "Price" . orderline:Qty a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Qty" . orderline:Discount a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Discount" . orderline:Extended-Price a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:decimal ; rdfs:label "Extended-Price" . orderline:Backorder a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:byte ; rdfs:label "Backorder" . invoice:Invoice a rdfs:Class ; rdfs:label "Invoice" ; rdfs:comment "Progress isports Invoice table" . invoice:Invoice-Num a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:integer ; rdfs:label "Invoice-Num" . invoice:Cust-Num a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:integer ; rdfs:label "Cust-Num" . invoice:Invoice-Date a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:date ; rdfs:label "Invoice-Date" . invoice:Amount a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:decimal ; rdfs:label "Amount" . invoice:Total-Paid a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:decimal ; rdfs:label "Total-Paid" . invoice:Adjustment a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:decimal ; rdfs:label "Adjustment" . invoice:Order-Num a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:integer ; rdfs:label "Order-Num" . invoice:Ship-Charge a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:decimal ; rdfs:label "Ship-Charge" . localdefault:Local-Default a rdfs:Class ; rdfs:label "Local-Default" ; rdfs:comment "Progress isports Local-Default table" . localdefault:Country a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Country" . localdefault:Region1-Label a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Region1-Label" . localdefault:Region2-Label a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Region2-Label" . localdefault:Postal-Label a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Postal-Label" . localdefault:Postal-Format a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Postal-Format" . localdefault:Tel-Format a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Tel-Format" . localdefault:Date-Format a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Date-Format" . localdefault:Currency-Symbol a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Currency-Symbol" . refcall:Ref-Call a rdfs:Class ; rdfs:label "Ref-Call" ; rdfs:comment "Progress isports Ref-Call table" . refcall:Call-Num a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:string ; rdfs:label "Call-Num" . refcall:Cust-Num a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:integer ; rdfs:label "Cust-Num" . refcall:Call-Date a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:date ; rdfs:label "Call-Date" . refcall:Sales-Rep a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:string ; rdfs:label "Sales-Rep" . refcall:Parent a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:string ; rdfs:label "Parent" . refcall:Txt a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:string ; rdfs:label "Txt" . salesrep:Salesrep a rdfs:Class ; rdfs:label "Salesrep" ; rdfs:comment "Progress isports Salesrep table" . salesrep:Sales-Rep a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Sales-Rep" . salesrep:Rep-Name a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Rep-Name" . salesrep:Region a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Region" . salesrep:Month-Quota-1 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@1" . salesrep:Month-Quota-2 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@2" . salesrep:Month-Quota-3 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@3" . salesrep:Month-Quota-4 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@4" . salesrep:Month-Quota-5 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@5" . salesrep:Month-Quota-6 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@6" . salesrep:Month-Quota-7 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@7" . salesrep:Month-Quota-8 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@8" . salesrep:Month-Quota-9 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@9" . salesrep:Month-Quota-10 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@10" . salesrep:Month-Quota-11 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@11" . salesrep:Month-Quota-12 a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota@12" . state:State a rdfs:Class ; rdfs:label "State" ; rdfs:comment "Progress isports State table" . state:State_ a rdf:Property ; rdfs:domain state:State ; rdfs:range xsd:string ; rdfs:label "State" . state:State-Name a rdf:Property ; rdfs:domain state:State ; rdfs:range xsd:string ; rdfs:label "State-Name" . state:Region a rdf:Property ; rdfs:domain state:State ; rdfs:range xsd:string ; rdfs:label "Region" . ', '', 'http://localhost:8890/schemas/progress/isports', 0); ----------- Create IRI Classes ------------- SPARQL prefix customer: <http://localhost:8890/schemas/progress/isports/customer/> prefix order: <http://localhost:8890/schemas/progress/isports/order/> prefix item: <http://localhost:8890/schemas/progress/isports/item/> prefix orderline: <http://localhost:8890/schemas/progress/isports/order_line/> prefix invoice: <http://localhost:8890/schemas/progress/isports/invoice/> prefix localdefault: <http://localhost:8890/schemas/progress/isports/local_default/> prefix refcall: <http://localhost:8890/schemas/progress/isports/ref_call/> prefix salesrep: <http://localhost:8890/schemas/progress/isports/salesrep/> prefix state: <http://localhost:8890/schemas/progress/isports/state/> create iri class customer:customer_iri "http://localhost:8890/progress/isports/customer/%d#this" (in Cust_Num integer not null) . create iri class order:order_iri "http://localhost:8890/progress/isports/order/%d#this" (in Order_Num integer not null) . create iri class item:item_iri "http://localhost:8890/progress/isports/item/%d#this" (in Item_num integer not null) . create iri class orderline:order-line_iri "http://localhost:8890/progress/isports/order-line/%d_%d#this" (in Order_num integer not null, in Line_num integer not null) . create iri class invoice:invoice_iri "http://localhost:8890/progress/isports/invoice/%d#this" (in Invoice_Num integer not null) . create iri class localdefault:local-default_iri "http://localhost:8890/progress/isports/local-default/%U#this" (in Country varchar not null) . create iri class refcall:ref-call_iri "http://localhost:8890/progress/isports/ref-call/%U#this" (in Call_Num varchar not null) . create iri class salesrep:salesrep_iri "http://localhost:8890/progress/isports/salesrep/%U#this" (in Sales_Rep varchar not null) . create iri class state:state_iri "http://localhost:8890/progress/isports/state/%U#this" (in State varchar not null) . ; ------------- Create Quad Store ------------------------------------ SPARQL prefix customer: <http://localhost:8890/schemas/progress/isports/customer/> prefix order: <http://localhost:8890/schemas/progress/isports/order/> prefix item: <http://localhost:8890/schemas/progress/isports/item/> prefix orderline: <http://localhost:8890/schemas/progress/isports/order_line/> prefix invoice: <http://localhost:8890/schemas/progress/isports/invoice/> prefix localdefault: <http://localhost:8890/schemas/progress/isports/local_default/> prefix refcall: <http://localhost:8890/schemas/progress/isports/ref_call/> prefix salesrep: <http://localhost:8890/schemas/progress/isports/salesrep/> prefix state: <http://localhost:8890/schemas/progress/isports/state/> alter quad storage virtrdf:DefaultQuadStorage from isports_rdf.pro91_isports_rdf.VCustomer as Customer_tbl from isports_rdf.pro91_isports_rdf.VOrder as Order_tbl from isports_rdf.pro91_isports_rdf.VItem as Item_tbl from isports_rdf.pro91_isports_rdf.VOrder_Line as Order_Line_tbl from isports_rdf.pro91_isports_rdf.VInvoice as Invoice_tbl from isports_rdf.pro91_isports_rdf.VRef_Call as Ref_Call_tbl from isports_rdf.pro91_isports_rdf.VRef_Call as Ref_Call_tbl_1 from isports_rdf.pro91_isports_rdf.VLocal_Default as Local_Default_tbl from isports_rdf.pro91_isports_rdf.VSalesrep as Salesrep_tbl from isports_rdf.pro91_isports_rdf.VState as State_tbl { create virtrdf:progress_isports as graph <http://localhost:8890/progress/isports> { customer:customer_iri (Customer_tbl.Cust_Num) a customer:Customer as virtrdf:customer_pk ; customer:Cust-Num Customer_tbl.Cust_Num as virtrdf:Customer_cust-num ; customer:Name Customer_tbl.Name as virtrdf:Customer_name ; customer:Address Customer_tbl.Address as virtrdf:Customer_address ; customer:Address2 Customer_tbl.Address2 as virtrdf:Customer_address2 ; customer:City Customer_tbl.City as virtrdf:Customer_city ; customer:State Customer_tbl.State as virtrdf:Customer_state ; customer:Country Customer_tbl.Country as virtrdf:Customer_country ; customer:Phone Customer_tbl.Phone as virtrdf:Customer_phone ; customer:Contact Customer_tbl.Contact as virtrdf:Customer_contact ; customer:Sales-Rep Customer_tbl.Sales_Rep as virtrdf:Customer_sales_rep ; customer:Comments Customer_tbl.Comments as virtrdf:Customer_comments ; customer:Credit-Limit Customer_tbl.Credit_Limit as virtrdf:Customer_credit-limit ; customer:Balance Customer_tbl.Balance as virtrdf:Customer_balance ; customer:Terms Customer_tbl.Terms as virtrdf:Customer_terms ; customer:Discount Customer_tbl.Discount as virtrdf:Customer_discount ; customer:Postal-Code Customer_tbl.Postal_Code as virtrdf:Customer_postal-code ; customer:from_state state:state_iri (State_tbl.State) where ( ^{Customer_tbl.}^.State = ^{State_tbl.}^.State ) as virtrdf:Customer_from_state ; customer:has_sales_rep salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) where ( ^{Customer_tbl.}^.Sales_Rep = ^{Salesrep_tbl.}^.Sales_Rep ) as virtrdf:Customer_has_sales_rep ; customer:has_local_default localdefault:local-default_iri (Local_Default_tbl.Country) where ( ^{Customer_tbl.}^.Country = ^{Local_Default_tbl.}^.Country ) as virtrdf:Customer_has_local_default ; customer:placed_order order:order_iri (Order_tbl.Order_num) where ( ^{Customer_tbl.}^.Cust_Num = ^{Order_tbl.}^.Cust_Num ) as virtrdf:Customer_placed_order ; customer:has_invoice invoice:invoice_iri (Invoice_tbl.Invoice_Num) where ( ^{Customer_tbl.}^.Cust_Num = ^{Invoice_tbl.}^.Cust_Num ) as virtrdf:Customer_has_invoice ; customer:ref_call refcall:ref-call_iri (Ref_Call_tbl.Call_Num) where ( ^{Customer_tbl.}^.Cust_Num = ^{Ref_Call_tbl.}^.Cust_Num ) as virtrdf:Customer_ref-call . order:order_iri (Order_tbl.Order_num) a order:Order as virtrdf:order_pk ; order:Order-num Order_tbl.Order_num as virtrdf:Order_order-num ; order:Cust-Num Order_tbl.Cust_Num as virtrdf:Order_cust_num ; order:Order-Date Order_tbl.Order_Date as virtrdf:Order_order-date ; order:Ship-Date Order_tbl.Ship_Date as virtrdf:Order_ship-date ; order:Promise-Date Order_tbl.Promise_Date as virtrdf:Order_promise-date ; order:Carrier Order_tbl.Carrier as virtrdf:Order_carrier ; order:Instructions Order_tbl.Instructions as virtrdf:Order_instructions ; order:PO Order_tbl.PO as virtrdf:Order_po ; order:Terms Order_tbl.Terms as virtrdf:Order_terms ; order:placed_by customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Order_tbl.}^.Cust_Num = ^{Customer_tbl.}^.Cust_Num ) as virtrdf:Order_placed_by ; order:Sales-Rep salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) where ( ^{Order_tbl.}^.Sales_Rep = ^{Salesrep_tbl.}^.Sales_Rep ) as virtrdf:Order_sales_rep ; order:invoiced_on invoice:invoice_iri (Invoice_tbl.Invoice_Num) where ( ^{Order_tbl.}^.Order_num = ^{Invoice_tbl.}^.Order_Num ) as virtrdf:Order_invoiced_on ; order:has_lines orderline:order-line_iri (Order_Line_tbl.Order_num, Order_Line_tbl.Line_num) where ( ^{Order_tbl.}^.Order_num = ^{Order_Line_tbl.}^.Order_num ) as virtrdf:Order_has_lines . item:item_iri (Item_tbl.Item_num) a item:Item as virtrdf:item_pk ; item:Item-num Item_tbl.Item_num as virtrdf:item_item-num ; item:Item-Name Item_tbl.Item_Name as virtrdf:Item_item-Name ; item:Cat-Page Item_tbl.Cat_Page as virtrdf:Item_cat-page ; item:Price Item_tbl.Price as virtrdf:Item_price ; item:Cat-Description Item_tbl.Cat_Description as virtrdf:Item_cat-description ; item:On-hand Item_tbl.On_hand as virtrdf:Item_on-hand ; item:Allocated Item_tbl.Allocated as virtrdf:Item_allocated ; item:Re-Order Item_tbl.Re_Order as virtrdf:Item_re-order ; item:On-Order Item_tbl.On_Order as virtrdf:Item_on-order ; item:order_line orderline:order-line_iri (Order_Line_tbl.Order_num, Order_Line_tbl.Line_num) where ( ^{Item_tbl.}^.Item_num = ^{Order_Line_tbl.}^.Item_num ) as virtrdf:Item_order_line . orderline:order-line_iri (Order_Line_tbl.Order_num, Order_Line_tbl.Line_num) a orderline:Order-Line as virtrdf:order-line_pk ; orderline:Line-num Order_Line_tbl.Line_num as virtrdf:Order-Line_line-num ; orderline:Price Order_Line_tbl.Price as virtrdf:Order-Line_price ; orderline:Qty Order_Line_tbl.Qty as virtrdf:Order-Line_qty ; orderline:Discount Order_Line_tbl.Discount as virtrdf:Order-Line_discount ; orderline:Extended-Price Order_Line_tbl.Extended_Price as virtrdf:Order-Line_extended-price ; orderline:Backorder Order_Line_tbl.Backorder as virtrdf:Order-Line_backorder ; orderline:Order-num order:order_iri (Order_tbl.Order_num) where ( ^{Order_Line_tbl.}^.Order_num = ^{Order_tbl.}^.Order_num ) as virtrdf:Order_Line_order_num ; orderline:Item-num item:item_iri (Item_tbl.Item_num) where ( ^{Order_Line_tbl.}^.Item_num = ^{Item_tbl.}^.Item_num ) as virtrdf:Order_Line_item_num . invoice:invoice_iri (Invoice_tbl.Invoice_Num) a invoice:Invoice as virtrdf:invoice_pk ; invoice:Invoice-Num Invoice_tbl.Invoice_Num as virtrdf:Invoice_invoice-num ; invoice:Cust-Num Invoice_tbl.Cust_Num as virtrdf:Invoice_cust_num ; invoice:Invoice-Date Invoice_tbl.Invoice_Date as virtrdf:Invoice_invoice-date ; invoice:Amount Invoice_tbl.Amount as virtrdf:Invoice_amount ; invoice:Total-Paid Invoice_tbl.Total_Paid as virtrdf:Invoice_total-paid ; invoice:Adjustment Invoice_tbl.Adjustment as virtrdf:Invoice_adjustment ; invoice:Order-Num Invoice_tbl.Order_Num as virtrdf:Invoice_order-num ; invoice:Ship-Charge Invoice_tbl.Ship_Charge as virtrdf:Invoice_ship-charge ; invoice:invoiced_to customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Invoice_tbl.}^.Cust_Num = ^{Customer_tbl.}^.Cust_Num ) as virtrdf:Invoice_invoiced_to ; invoice:Order-Num order:order_iri (Order_tbl.Order_num) where ( ^{Invoice_tbl.}^.Order_Num = ^{Order_tbl.}^.Order_num ) as virtrdf:Invoice_order_num . localdefault:local-default_iri (Local_Default_tbl.Country) a localdefault:Local-Default as virtrdf:local-default_pk ; localdefault:Country Local_Default_tbl.Country as virtrdf:local-default_country ; localdefault:Region1-Label Local_Default_tbl.Region1_Label as virtrdf:Local-Default_region1-label ; localdefault:Region2-Label Local_Default_tbl.Region2_Label as virtrdf:Local-Default_region2-label ; localdefault:Postal-Label Local_Default_tbl.Postal_Label as virtrdf:Local-Default_postal-label ; localdefault:Postal-Format Local_Default_tbl.Postal_Format as virtrdf:Local-Default_postal-format ; localdefault:Tel-Format Local_Default_tbl.Tel_Format as virtrdf:Local-Default_tel-format ; localdefault:Date-Format Local_Default_tbl.Date_Format as virtrdf:Local-Default_date-format ; localdefault:Currency-Symbol Local_Default_tbl.Currency_Symbol as virtrdf:Local-Default_currency-symbol ; localdefault:has_customer customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Local_Default_tbl.}^.Country = ^{Customer_tbl.}^.Country ) as virtrdf:Local-Default_has_customer . refcall:ref-call_iri (Ref_Call_tbl.Call_Num) a refcall:Ref-Call as virtrdf:ref-call_pk ; refcall:Call-Num Ref_Call_tbl.Call_Num as virtrdf:Ref-Call_call-num ; refcall:Cust-Num Ref_Call_tbl.Cust_Num as virtrdf:Ref-Call_cust-num ; refcall:Call-Date Ref_Call_tbl.Call_Date as virtrdf:Ref-Call_call-date ; refcall:Sales-Rep Ref_Call_tbl.Sales_Rep as virtrdf:Ref-sales-rep ; refcall:Parent Ref_Call_tbl.Parent as virtrdf:Ref-Call_parent ; refcall:Txt Ref_Call_tbl.Txt as virtrdf:Ref-Call_txt ; refcall:made_to customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Ref_Call_tbl.}^.Cust_Num = ^{Customer_tbl.}^.Cust_Num ) as virtrdf:Ref-Call_made_to ; refcall:made_by salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) where ( ^{Ref_Call_tbl.}^.Sales_Rep = ^{Salesrep_tbl.}^.Sales_Rep ) as virtrdf:Ref-Call_made-by ; refcall:has_parent refcall:ref-call_iri (Ref_Call_tbl_1.Call_Num) where ( ^{Ref_Call_tbl.}^.Parent = ^{Ref_Call_tbl_1.}^.Call_Num ) as virtrdf:Ref-Call_has_parent . salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) a salesrep:Salesrep as virtrdf:salesrep_pk ; salesrep:Sales-Rep Salesrep_tbl.Sales_Rep as virtrdf:Salesrep_sales-rep ; salesrep:Region Salesrep_tbl.Region as virtrdf:Salesrep_region ; salesrep:Rep-Name Salesrep_tbl.Rep_Name as virtrdf:Salesrep_rep-name ; salesrep:Month-Quota-1 Salesrep_tbl.Month_Quota_1 as virtrdf:Salesrep_month-quota-1 ; salesrep:Month-Quota-2 Salesrep_tbl.Month_Quota_2 as virtrdf:Salesrep_month-quota-2 ; salesrep:Month-Quota-3 Salesrep_tbl.Month_Quota_3 as virtrdf:Salesrep_month-quota-3 ; salesrep:Month-Quota-4 Salesrep_tbl.Month_Quota_4 as virtrdf:Salesrep_month-quota-4 ; salesrep:Month-Quota-5 Salesrep_tbl.Month_Quota_5 as virtrdf:Salesrep_month-quota-5 ; salesrep:Month-Quota-6 Salesrep_tbl.Month_Quota_6 as virtrdf:Salesrep_month-quota-6 ; salesrep:Month-Quota-7 Salesrep_tbl.Month_Quota_7 as virtrdf:Salesrep_month-quota-7 ; salesrep:Month-Quota-8 Salesrep_tbl.Month_Quota_8 as virtrdf:Salesrep_month-quota-8 ; salesrep:Month-Quota-9 Salesrep_tbl.Month_Quota_9 as virtrdf:Salesrep_month-quota-9 ; salesrep:Month-Quota-10 Salesrep_tbl.Month_Quota_10 as virtrdf:Salesrep_month-quota-10 ; salesrep:Month-Quota-11 Salesrep_tbl.Month_Quota_11 as virtrdf:Salesrep_month-quota-11 ; salesrep:Month-Quota-12 Salesrep_tbl.Month_Quota_12 as virtrdf:Salesrep_month-quota-12 ; salesrep:is_sales_rep_for customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Salesrep_tbl.}^.Sales_Rep = ^{Customer_tbl.}^.Sales_Rep ) as virtrdf:Salesrep_is_sales_rep_for ; salesrep:has_order order:order_iri (Order_tbl.Order_num) where ( ^{Salesrep_tbl.}^.Sales_Rep = ^{Order_tbl.}^.Sales_Rep ) as virtrdf:Salesrep_has_order ; salesrep:manages_region state:state_iri (State_tbl.State) where ( ^{Salesrep_tbl.}^.Region = ^{State_tbl.}^.Region ) as virtrdf:Salesrep_manages_region ; salesrep:made_call refcall:ref-call_iri (Ref_Call_tbl.Call_Num) where ( ^{Salesrep_tbl.}^.Sales_Rep = ^{Ref_Call_tbl.}^.Sales_Rep ) as virtrdf:Ref-Call_made_call . state:state_iri (State_tbl.State) a state:State as virtrdf:state_pk ; state:State_ State_tbl.State as virtrdf:State_state ; state:State-Name State_tbl.State_Name as virtrdf:State_state-name ; state:Region State_tbl.Region as virtrdf:State_region ; state:has_customer customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{State_tbl.}^.State = ^{Customer_tbl.}^.State ) as virtrdf:State_has_customer ; state:has_sales_rep salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) where ( ^{State_tbl.}^.Region = ^{Salesrep_tbl.}^.Region ) as virtrdf:State_has_sales_rep . } . } . ; delete from db.dba.url_rewrite_rule_list where urrl_list like 'progress_isports_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'progress_isports_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'progress_isports_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'progress_isports_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=DESCRIBE+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+FROM+%%3Chttp%%3A//localhost%%3A8890/progress/isports%%3E&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'progress_isports_rule_list1', 1, vector ( 'progress_isports_rule1', 'progress_isports_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/progress/isports'); VHOST_DEFINE ( lpath=>'/progress/isports', ppath=>'/DAV/progress/isports/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'progress_isports_rule_list1') ); delete from db.dba.url_rewrite_rule_list where urrl_list like 'progress_isports_schemas_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'progress_isports_schemas_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'progress_isports_schemas_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'progress_isports_schemas_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}%%0D%%0AFROM+%%3Chttp%%3A//localhost%%3A8890/schemas/progress/isports%%3E+%%0D%%0AWHERE+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path','path','*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'progress_isports_schemas_rule_list1', 1, vector ( 'progress_isports_schemas_rule1', 'progress_isports_schemas_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/schemas/progress/isports'); VHOST_DEFINE ( lpath=>'/schemas/progress/isports', ppath=>'/DAV/schemas/progress/isports/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'progress_isports_schemas_rule_list1') ); DB.DBA.XML_SET_NS_DECL ('customer', 'http://^{URIQADefaultHost}^/schemas/progress/isports/customer/', 2); DB.DBA.XML_SET_NS_DECL ('order', 'http://^{URIQADefaultHost}^/schemas/progress/isports/order/', 2); DB.DBA.XML_SET_NS_DECL ('item', 'http://^{URIQADefaultHost}^/schemas/progress/isports/item/', 2); DB.DBA.XML_SET_NS_DECL ('orderline', 'http://^{URIQADefaultHost}^/schemas/progress/isports/order_line/', 2); DB.DBA.XML_SET_NS_DECL ('invoice', 'http://^{URIQADefaultHost}^/schemas/progress/isports/invoice/', 2); DB.DBA.XML_SET_NS_DECL ('localdefault', 'http://^{URIQADefaultHost}^/schemas/progress/isports/local_default/', 2); DB.DBA.XML_SET_NS_DECL ('refcall', 'http://^{URIQADefaultHost}^/schemas/progress/isports/ref_call/', 2); DB.DBA.XML_SET_NS_DECL ('salesrep', 'http://^{URIQADefaultHost}^/schemas/progress/isports/salesrep/', 2); DB.DBA.XML_SET_NS_DECL ('state', 'http://^{URIQADefaultHost}^/schemas/progress/isports/state/', 2);
ATTACH TABLE "PUB"."Customer" PRIMARY KEY ("Cust-Num") AS "isports_rdf"."prs10_isports_rdf"."Customer" FROM 'prs10_isports_rdf'; ATTACH TABLE "PUB"."Invoice" PRIMARY KEY ("Invoice-Num") AS "isports_rdf"."prs10_isports_rdf"."Invoice" FROM 'prs10_isports_rdf'; ATTACH TABLE "PUB"."Item" PRIMARY KEY ("Item-num") AS "isports_rdf"."prs10_isports_rdf"."Item" FROM 'prs10_isports_rdf'; ATTACH TABLE "PUB"."Local-Default" PRIMARY KEY ("Country") AS "isports_rdf"."prs10_isports_rdf"."Local-Default" FROM 'prs10_isports_rdf'; ATTACH TABLE "PUB"."Order" PRIMARY KEY ("Order-num") AS "isports_rdf"."prs10_isports_rdf"."Order" FROM 'prs10_isports_rdf'; ATTACH TABLE "PUB"."Order-Line" PRIMARY KEY ("Order-num", "Line-num") AS "isports_rdf"."prs10_isports_rdf"."Order-Line" FROM 'prs10_isports_rdf'; ATTACH TABLE "PUB"."Ref-Call" PRIMARY KEY ("Call-Num") AS "isports_rdf"."prs10_isports_rdf"."Ref-Call" FROM 'prs10_isports_rdf'; ATTACH TABLE "PUB"."Salesrep" PRIMARY KEY ("Sales-Rep") AS "isports_rdf"."prs10_isports_rdf"."Salesrep" FROM 'prs10_isports_rdf'; ATTACH TABLE "PUB"."State" PRIMARY KEY ("State") AS "isports_rdf"."prs10_isports_rdf"."State" FROM 'prs10_isports_rdf'; COMMIT WORK; GRANT SELECT ON isports_rdf.prs10_isports_rdf.Customer TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf."Order" TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.Item TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf."Order-Line" TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.Invoice TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf."Local-Default" TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf."Ref-Call" TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.Salesrep TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.State TO "SPARQL", "SPARQL_UPDATE"; GRANT SPARQL_UPDATE to "SPARQL"; CREATE VIEW isports_rdf.prs10_isports_rdf.VCustomer AS SELECT "Cust-Num" AS Cust_Num, Name, Address, Address2, City, State, Country, Phone, Contact, "Sales-Rep" AS Sales_Rep, Comments, "Credit-Limit" AS Credit_Limit, Balance, Terms, Discount, "Postal-Code" AS Postal_Code FROM isports_rdf.prs10_isports_rdf.Customer; CREATE VIEW isports_rdf.prs10_isports_rdf.VOrder AS SELECT "Order-num" AS Order_num, "Cust-Num" AS Cust_Num, "Order-Date" AS Order_Date, "Ship-Date" AS Ship_Date, "Promise-Date" AS Promise_Date, Carrier, Instructions, PO, Terms, "Sales-Rep" AS Sales_Rep FROM isports_rdf.prs10_isports_rdf."Order"; CREATE VIEW isports_rdf.prs10_isports_rdf.VItem AS SELECT "Item-num" AS Item_num, "Item-Name" AS Item_Name, "Cat-Page" AS Cat_Page, Price, "Cat-Description" AS Cat_Description, "On-hand" AS On_hand, Allocated, "Re-Order" AS Re_Order, "On-Order" AS On_Order FROM isports_rdf.prs10_isports_rdf.Item; CREATE VIEW isports_rdf.prs10_isports_rdf.VOrder_Line AS SELECT "Order-num" AS Order_num, "Line-num" AS Line_num, "Item-num" AS Item_num, Price, Qty, Discount, "Extended-Price" AS Extended_Price, Backorder FROM isports_rdf.prs10_isports_rdf."Order-Line"; CREATE VIEW isports_rdf.prs10_isports_rdf.VInvoice AS SELECT "Invoice-Num" AS Invoice_Num, "Cust-Num" AS Cust_Num, "Invoice-Date" AS Invoice_Date, Amount, "Total-Paid" AS Total_Paid, Adjustment, "Order-Num" AS Order_Num, "Ship-Charge" AS Ship_Charge FROM isports_rdf.prs10_isports_rdf.Invoice; CREATE VIEW isports_rdf.prs10_isports_rdf.VLocal_Default AS SELECT Country, "Region1-Label" AS Region1_Label, "Region2-Label" AS Region2_Label, "Postal-Label" AS Postal_Label, "Postal-Format" AS Postal_Format, "Tel-Format" AS Tel_Format, "Date-Format" AS Date_Format, "Currency-Symbol" AS Currency_Symbol FROM isports_rdf.prs10_isports_rdf."Local-Default"; CREATE VIEW isports_rdf.prs10_isports_rdf.VRef_Call AS SELECT "Call-Num" AS Call_Num, "Cust-Num" AS Cust_Num, "Call-Date" AS Call_Date, "Sales-Rep" AS Sales_Rep, Parent, Txt FROM isports_rdf.prs10_isports_rdf."Ref-Call"; CREATE VIEW isports_rdf.prs10_isports_rdf.VSalesrep AS SELECT "Rep-Name" AS Rep_Name, Region, "Sales-Rep" AS Sales_Rep, "Month-Quota" AS Month_Quota FROM isports_rdf.prs10_isports_rdf.Salesrep; CREATE VIEW isports_rdf.prs10_isports_rdf.VState AS SELECT State, "State-Name" AS State_Name, Region FROM isports_rdf.prs10_isports_rdf.State; GRANT SELECT ON isports_rdf.prs10_isports_rdf.VCustomer TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.VOrder TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.VItem TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.VOrder_Line TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.VInvoice TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.VLocal_Default TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.VRef_Call TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.VSalesrep TO "SPARQL", "SPARQL_UPDATE"; GRANT SELECT ON isports_rdf.prs10_isports_rdf.VState TO "SPARQL", "SPARQL_UPDATE"; -------- Create rdfs:Class definitions ---------------------------- ttlp ( ' @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix customer: <http://localhost:8890/schemas/progress/isports/customer/> . @prefix order: <http://localhost:8890/schemas/progress/isports/order/> . @prefix item: <http://localhost:8890/schemas/progress/isports/item/> . @prefix orderline: <http://localhost:8890/schemas/progress/isports/order_line/> . @prefix invoice: <http://localhost:8890/schemas/progress/isports/invoice/> . @prefix localdefault: <http://localhost:8890/schemas/progress/isports/local_default/> . @prefix refcall: <http://localhost:8890/schemas/progress/isports/ref_call/> . @prefix salesrep: <http://localhost:8890/schemas/progress/isports/salesrep/> . @prefix state: <http://localhost:8890/schemas/progress/isports/state/> . customer:Customer a rdfs:Class ; rdfs:label "Customer" ; rdfs:comment "Progress isports Customer table" . customer:Cust-Num a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:integer ; rdfs:label "Cust-Num" . customer:Name a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Name" . customer:Address a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Address" . customer:Address2 a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Address2" . customer:City a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "City" . customer:State a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "State" . customer:Country a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Country" . customer:Phone a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Phone" . customer:Contact a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Contact" . customer:Sales-Rep a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Sales-Rep" . customer:Comments a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Comments" . customer:Credit-Limit a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:decimal ; rdfs:label "Credit-Limit" . customer:Balance a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:decimal ; rdfs:label "Balance" . customer:Terms a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Terms" . customer:Discount a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:integer ; rdfs:label "Discount" . customer:Postal-Code a rdf:Property ; rdfs:domain customer:Customer ; rdfs:range xsd:string ; rdfs:label "Postal-Code" . order:Order a rdfs:Class ; rdfs:label "Order" ; rdfs:comment "Progress isports Order table" . order:Order-num a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:integer ; rdfs:label "Order-num" . order:Cust-Num a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:integer ; rdfs:label "Cust-Num" . order:Order-Date a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:date ; rdfs:label "Order-Date" . order:Ship-Date a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:date ; rdfs:label "Ship-Date" . order:Promise-Date a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:date ; rdfs:label "Promise-Date" . order:Carrier a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "Carrier" . order:Instructions a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "Instructions" . order:PO a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "PO" . order:Terms a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "Terms" . order:Sales-Rep a rdf:Property ; rdfs:domain order:Order ; rdfs:range xsd:string ; rdfs:label "Sales-Rep" . item:Item a rdfs:Class ; rdfs:label "Item" ; rdfs:comment "Progress isports Item table" . item:Item-num a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "Item-num" . item:Item-Name a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:string ; rdfs:label "Item-Name" . item:Cat-Page a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "Cat-Page" . item:Price a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:decimal ; rdfs:label "Price" . item:Cat-Description a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:string ; rdfs:label "Cat-Description" . item:On-hand a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "On-hand" . item:Allocated a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "Allocated" . item:Re-Order a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "Re-Order" . item:On-Order a rdf:Property ; rdfs:domain item:Item ; rdfs:range xsd:integer ; rdfs:label "On-Order" . orderline:Order-Line a rdfs:Class ; rdfs:label "Order-Line" ; rdfs:comment "Progress isports Order-Line table" . orderline:Order-num a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Order-num" . orderline:Line-num a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Line-num" . orderline:Item-num a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Item-num" . orderline:Price a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:decimal ; rdfs:label "Price" . orderline:Qty a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Qty" . orderline:Discount a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:integer ; rdfs:label "Discount" . orderline:Extended-Price a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:decimal ; rdfs:label "Extended-Price" . orderline:Backorder a rdf:Property ; rdfs:domain orderline:Order-Line ; rdfs:range xsd:byte ; rdfs:label "Backorder" . invoice:Invoice a rdfs:Class ; rdfs:label "Invoice" ; rdfs:comment "Progress isports Invoice table" . invoice:Invoice-Num a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:integer ; rdfs:label "Invoice-Num" . invoice:Cust-Num a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:integer ; rdfs:label "Cust-Num" . invoice:Invoice-Date a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:date ; rdfs:label "Invoice-Date" . invoice:Amount a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:decimal ; rdfs:label "Amount" . invoice:Total-Paid a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:decimal ; rdfs:label "Total-Paid" . invoice:Adjustment a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:decimal ; rdfs:label "Adjustment" . invoice:Order-Num a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:integer ; rdfs:label "Order-Num" . invoice:Ship-Charge a rdf:Property ; rdfs:domain invoice:Invoice ; rdfs:range xsd:decimal ; rdfs:label "Ship-Charge" . localdefault:Local-Default a rdfs:Class ; rdfs:label "Local-Default" ; rdfs:comment "Progress isports Local-Default table" . localdefault:Country a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Country" . localdefault:Region1-Label a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Region1-Label" . localdefault:Region2-Label a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Region2-Label" . localdefault:Postal-Label a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Postal-Label" . localdefault:Postal-Format a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Postal-Format" . localdefault:Tel-Format a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Tel-Format" . localdefault:Date-Format a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Date-Format" . localdefault:Currency-Symbol a rdf:Property ; rdfs:domain localdefault:Local-Default ; rdfs:range xsd:string ; rdfs:label "Currency-Symbol" . refcall:Ref-Call a rdfs:Class ; rdfs:label "Ref-Call" ; rdfs:comment "Progress isports Ref-Call table" . refcall:Call-Num a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:string ; rdfs:label "Call-Num" . refcall:Cust-Num a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:integer ; rdfs:label "Cust-Num" . refcall:Call-Date a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:date ; rdfs:label "Call-Date" . refcall:Sales-Rep a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:string ; rdfs:label "Sales-Rep" . refcall:Parent a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:string ; rdfs:label "Parent" . refcall:Txt a rdf:Property ; rdfs:domain refcall:Ref-Call ; rdfs:range xsd:string ; rdfs:label "Txt" . salesrep:Salesrep a rdfs:Class ; rdfs:label "Salesrep" ; rdfs:comment "Progress isports Salesrep table" . salesrep:Sales-Rep a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Sales-Rep" . salesrep:Rep-Name a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Rep-Name" . salesrep:Region a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Region" . salesrep:Month-Quota a rdf:Property ; rdfs:domain salesrep:Salesrep ; rdfs:range xsd:string ; rdfs:label "Month-Quota" . state:State a rdfs:Class ; rdfs:label "State" ; rdfs:comment "Progress isports State table" . state:State_ a rdf:Property ; rdfs:domain state:State ; rdfs:range xsd:string ; rdfs:label "State" . state:State-Name a rdf:Property ; rdfs:domain state:State ; rdfs:range xsd:string ; rdfs:label "State-Name" . state:Region a rdf:Property ; rdfs:domain state:State ; rdfs:range xsd:string ; rdfs:label "Region" . ', '', 'http://localhost:8890/schemas/progress/isports', 0); ----------- Create IRI Classes ------------- SPARQL prefix customer: <http://localhost:8890/schemas/progress/isports/customer/> prefix order: <http://localhost:8890/schemas/progress/isports/order/> prefix item: <http://localhost:8890/schemas/progress/isports/item/> prefix orderline: <http://localhost:8890/schemas/progress/isports/order_line/> prefix invoice: <http://localhost:8890/schemas/progress/isports/invoice/> prefix localdefault: <http://localhost:8890/schemas/progress/isports/local_default/> prefix refcall: <http://localhost:8890/schemas/progress/isports/ref_call/> prefix salesrep: <http://localhost:8890/schemas/progress/isports/salesrep/> prefix state: <http://localhost:8890/schemas/progress/isports/state/> create iri class customer:customer_iri "http://localhost:8890/progress/isports/customer/%d#this" (in Cust_Num integer not null) . create iri class order:order_iri "http://localhost:8890/progress/isports/order/%d#this" (in Order_Num integer not null) . create iri class item:item_iri "http://localhost:8890/progress/isports/item/%d#this" (in Item_num integer not null) . create iri class orderline:order-line_iri "http://localhost:8890/progress/isports/order-line/%d_%d#this" (in Order_num integer not null, in Line_num integer not null) . create iri class invoice:invoice_iri "http://localhost:8890/progress/isports/invoice/%d#this" (in Invoice_Num integer not null) . create iri class localdefault:local-default_iri "http://localhost:8890/progress/isports/local-default/%U#this" (in Country varchar not null) . create iri class refcall:ref-call_iri "http://localhost:8890/progress/isports/ref-call/%U#this" (in Call_Num varchar not null) . create iri class salesrep:salesrep_iri "http://localhost:8890/progress/isports/salesrep/%U#this" (in Sales_Rep varchar not null) . create iri class state:state_iri "http://localhost:8890/progress/isports/state/%U#this" (in State varchar not null) . ; ------------- Create Quad Store ------------------------------------ SPARQL prefix customer: <http://localhost:8890/schemas/progress/isports/customer/> prefix order: <http://localhost:8890/schemas/progress/isports/order/> prefix item: <http://localhost:8890/schemas/progress/isports/item/> prefix orderline: <http://localhost:8890/schemas/progress/isports/order_line/> prefix invoice: <http://localhost:8890/schemas/progress/isports/invoice/> prefix localdefault: <http://localhost:8890/schemas/progress/isports/local_default/> prefix refcall: <http://localhost:8890/schemas/progress/isports/ref_call/> prefix salesrep: <http://localhost:8890/schemas/progress/isports/salesrep/> prefix state: <http://localhost:8890/schemas/progress/isports/state/> alter quad storage virtrdf:DefaultQuadStorage from isports_rdf.prs10_isports_rdf.VCustomer as Customer_tbl from isports_rdf.prs10_isports_rdf.VOrder as Order_tbl from isports_rdf.prs10_isports_rdf.VItem as Item_tbl from isports_rdf.prs10_isports_rdf.VOrder_Line as Order_Line_tbl from isports_rdf.prs10_isports_rdf.VInvoice as Invoice_tbl from isports_rdf.prs10_isports_rdf.VRef_Call as Ref_Call_tbl from isports_rdf.prs10_isports_rdf.VRef_Call as Ref_Call_tbl_1 -- Additional Ref_Call_tbl_1 alias required to represent recursive FK relationship (refcall:has_parent) below. from isports_rdf.prs10_isports_rdf.VLocal_Default as Local_Default_tbl from isports_rdf.prs10_isports_rdf.VSalesrep as Salesrep_tbl from isports_rdf.prs10_isports_rdf.VState as State_tbl { create virtrdf:progress_isports as graph <http://localhost:8890/progress/isports> { customer:customer_iri (Customer_tbl.Cust_Num) a customer:Customer as virtrdf:customer_pk ; customer:Cust-Num Customer_tbl.Cust_Num as virtrdf:Customer_cust-num ; customer:Name Customer_tbl.Name as virtrdf:Customer_name ; customer:Address Customer_tbl.Address as virtrdf:Customer_address ; customer:Address2 Customer_tbl.Address2 as virtrdf:Customer_address2 ; customer:City Customer_tbl.City as virtrdf:Customer_city ; customer:State Customer_tbl.State as virtrdf:Customer_state ; customer:Country Customer_tbl.Country as virtrdf:Customer_country ; customer:Phone Customer_tbl.Phone as virtrdf:Customer_phone ; customer:Contact Customer_tbl.Contact as virtrdf:Customer_contact ; customer:Sales-Rep Customer_tbl.Sales_Rep as virtrdf:Customer_sales_rep ; customer:Comments Customer_tbl.Comments as virtrdf:Customer_comments ; customer:Credit-Limit Customer_tbl.Credit_Limit as virtrdf:Customer_credit-limit ; customer:Balance Customer_tbl.Balance as virtrdf:Customer_balance ; customer:Terms Customer_tbl.Terms as virtrdf:Customer_terms ; customer:Discount Customer_tbl.Discount as virtrdf:Customer_discount ; customer:Postal-Code Customer_tbl.Postal_Code as virtrdf:Customer_postal-code ; customer:from_state state:state_iri (State_tbl.State) where ( ^{Customer_tbl.}^.State = ^{State_tbl.}^.State ) as virtrdf:Customer_from_state ; customer:has_sales_rep salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) where ( ^{Customer_tbl.}^.Sales_Rep = ^{Salesrep_tbl.}^.Sales_Rep ) as virtrdf:Customer_has_sales_rep ; customer:has_local_default localdefault:local-default_iri (Local_Default_tbl.Country) where ( ^{Customer_tbl.}^.Country = ^{Local_Default_tbl.}^.Country ) as virtrdf:Customer_has_local_default ; customer:placed_order order:order_iri (Order_tbl.Order_num) where ( ^{Customer_tbl.}^.Cust_Num = ^{Order_tbl.}^.Cust_Num ) as virtrdf:Customer_placed_order ; customer:has_invoice invoice:invoice_iri (Invoice_tbl.Invoice_Num) where ( ^{Customer_tbl.}^.Cust_Num = ^{Invoice_tbl.}^.Cust_Num ) as virtrdf:Customer_has_invoice ; customer:ref_call refcall:ref-call_iri (Ref_Call_tbl.Call_Num) where ( ^{Customer_tbl.}^.Cust_Num = ^{Ref_Call_tbl.}^.Cust_Num ) as virtrdf:Customer_ref-call . order:order_iri (Order_tbl.Order_num) a order:Order as virtrdf:order_pk ; order:Order-num Order_tbl.Order_num as virtrdf:Order_order-num ; order:Cust-Num Order_tbl.Cust_Num as virtrdf:Order_cust_num ; order:Order-Date Order_tbl.Order_Date as virtrdf:Order_order-date ; order:Ship-Date Order_tbl.Ship_Date as virtrdf:Order_ship-date ; order:Promise-Date Order_tbl.Promise_Date as virtrdf:Order_promise-date ; order:Carrier Order_tbl.Carrier as virtrdf:Order_carrier ; order:Instructions Order_tbl.Instructions as virtrdf:Order_instructions ; order:PO Order_tbl.PO as virtrdf:Order_po ; order:Terms Order_tbl.Terms as virtrdf:Order_terms ; order:placed_by customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Order_tbl.}^.Cust_Num = ^{Customer_tbl.}^.Cust_Num ) as virtrdf:Order_placed_by ; order:Sales-Rep salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) where ( ^{Order_tbl.}^.Sales_Rep = ^{Salesrep_tbl.}^.Sales_Rep ) as virtrdf:Order_sales_rep ; order:invoiced_on invoice:invoice_iri (Invoice_tbl.Invoice_Num) where ( ^{Order_tbl.}^.Order_num = ^{Invoice_tbl.}^.Order_Num ) as virtrdf:Order_invoiced_on ; order:has_lines orderline:order-line_iri (Order_Line_tbl.Order_num, Order_Line_tbl.Line_num) where ( ^{Order_tbl.}^.Order_num = ^{Order_Line_tbl.}^.Order_num ) as virtrdf:Order_has_lines . item:item_iri (Item_tbl.Item_num) a item:Item as virtrdf:item_pk ; item:Item-num Item_tbl.Item_num as virtrdf:item_item-num ; item:Item-Name Item_tbl.Item_Name as virtrdf:Item_item-Name ; item:Cat-Page Item_tbl.Cat_Page as virtrdf:Item_cat-page ; item:Price Item_tbl.Price as virtrdf:Item_price ; item:Cat-Description Item_tbl.Cat_Description as virtrdf:Item_cat-description ; item:On-hand Item_tbl.On_hand as virtrdf:Item_on-hand ; item:Allocated Item_tbl.Allocated as virtrdf:Item_allocated ; item:Re-Order Item_tbl.Re_Order as virtrdf:Item_re-order ; item:On-Order Item_tbl.On_Order as virtrdf:Item_on-order ; item:order_line orderline:order-line_iri (Order_Line_tbl.Order_num, Order_Line_tbl.Line_num) where ( ^{Item_tbl.}^.Item_num = ^{Order_Line_tbl.}^.Item_num ) as virtrdf:Item_order_line . orderline:order-line_iri (Order_Line_tbl.Order_num, Order_Line_tbl.Line_num) a orderline:Order-Line as virtrdf:order-line_pk ; orderline:Line-num Order_Line_tbl.Line_num as virtrdf:Order-Line_line-num ; orderline:Price Order_Line_tbl.Price as virtrdf:Order-Line_price ; orderline:Qty Order_Line_tbl.Qty as virtrdf:Order-Line_qty ; orderline:Discount Order_Line_tbl.Discount as virtrdf:Order-Line_discount ; orderline:Extended-Price Order_Line_tbl.Extended_Price as virtrdf:Order-Line_extended-price ; orderline:Backorder Order_Line_tbl.Backorder as virtrdf:Order-Line_backorder ; orderline:Order-num order:order_iri (Order_tbl.Order_num) where ( ^{Order_Line_tbl.}^.Order_num = ^{Order_tbl.}^.Order_num ) as virtrdf:Order_Line_order_num ; orderline:Item-num item:item_iri (Item_tbl.Item_num) where ( ^{Order_Line_tbl.}^.Item_num = ^{Item_tbl.}^.Item_num ) as virtrdf:Order_Line_item_num . invoice:invoice_iri (Invoice_tbl.Invoice_Num) a invoice:Invoice as virtrdf:invoice_pk ; invoice:Invoice-Num Invoice_tbl.Invoice_Num as virtrdf:Invoice_invoice-num ; invoice:Cust-Num Invoice_tbl.Cust_Num as virtrdf:Invoice_cust_num ; invoice:Invoice-Date Invoice_tbl.Invoice_Date as virtrdf:Invoice_invoice-date ; invoice:Amount Invoice_tbl.Amount as virtrdf:Invoice_amount ; invoice:Total-Paid Invoice_tbl.Total_Paid as virtrdf:Invoice_total-paid ; invoice:Adjustment Invoice_tbl.Adjustment as virtrdf:Invoice_adjustment ; invoice:Order-Num Invoice_tbl.Order_Num as virtrdf:Invoice_order-num ; invoice:Ship-Charge Invoice_tbl.Ship_Charge as virtrdf:Invoice_ship-charge ; invoice:invoiced_to customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Invoice_tbl.}^.Cust_Num = ^{Customer_tbl.}^.Cust_Num ) as virtrdf:Invoice_invoiced_to ; invoice:Order-Num order:order_iri (Order_tbl.Order_num) where ( ^{Invoice_tbl.}^.Order_Num = ^{Order_tbl.}^.Order_num ) as virtrdf:Invoice_order_num . localdefault:local-default_iri (Local_Default_tbl.Country) a localdefault:Local-Default as virtrdf:local-default_pk ; localdefault:Country Local_Default_tbl.Country as virtrdf:local-default_country ; localdefault:Region1-Label Local_Default_tbl.Region1_Label as virtrdf:Local-Default_region1-label ; localdefault:Region2-Label Local_Default_tbl.Region2_Label as virtrdf:Local-Default_region2-label ; localdefault:Postal-Label Local_Default_tbl.Postal_Label as virtrdf:Local-Default_postal-label ; localdefault:Postal-Format Local_Default_tbl.Postal_Format as virtrdf:Local-Default_postal-format ; localdefault:Tel-Format Local_Default_tbl.Tel_Format as virtrdf:Local-Default_tel-format ; localdefault:Date-Format Local_Default_tbl.Date_Format as virtrdf:Local-Default_date-format ; localdefault:Currency-Symbol Local_Default_tbl.Currency_Symbol as virtrdf:Local-Default_currency-symbol ; localdefault:has_customer customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Local_Default_tbl.}^.Country = ^{Customer_tbl.}^.Country ) as virtrdf:Local-Default_has_customer . refcall:ref-call_iri (Ref_Call_tbl.Call_Num) a refcall:Ref-Call as virtrdf:ref-call_pk ; refcall:Call-Num Ref_Call_tbl.Call_Num as virtrdf:Ref-Call_call-num ; refcall:Cust-Num Ref_Call_tbl.Cust_Num as virtrdf:Ref-Call_cust-num ; refcall:Call-Date Ref_Call_tbl.Call_Date as virtrdf:Ref-Call_call-date ; refcall:Sales-Rep Ref_Call_tbl.Sales_Rep as virtrdf:Ref-sales-rep ; refcall:Parent Ref_Call_tbl.Parent as virtrdf:Ref-Call_parent ; refcall:Txt Ref_Call_tbl.Txt as virtrdf:Ref-Call_txt ; refcall:made_to customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Ref_Call_tbl.}^.Cust_Num = ^{Customer_tbl.}^.Cust_Num ) as virtrdf:Ref-Call_made_to ; refcall:made_by salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) where ( ^{Ref_Call_tbl.}^.Sales_Rep = ^{Salesrep_tbl.}^.Sales_Rep ) as virtrdf:Ref-Call_made-by ; refcall:has_parent refcall:ref-call_iri (Ref_Call_tbl_1.Call_Num) where ( ^{Ref_Call_tbl.}^.Parent = ^{Ref_Call_tbl_1.}^.Call_Num ) as virtrdf:Ref-Call_has_parent . salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) a salesrep:Salesrep as virtrdf:salesrep_pk ; salesrep:Sales-Rep Salesrep_tbl.Sales_Rep as virtrdf:Salesrep_sales-rep ; salesrep:Region Salesrep_tbl.Region as virtrdf:Salesrep_region ; salesrep:Rep-Name Salesrep_tbl.Rep_Name as virtrdf:Salesrep_rep-name ; salesrep:Month-Quota Salesrep_tbl.Month_Quota as virtrdf:Salesrep_month-quota ; salesrep:is_sales_rep_for customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{Salesrep_tbl.}^.Sales_Rep = ^{Customer_tbl.}^.Sales_Rep ) as virtrdf:Salesrep_is_sales_rep_for ; salesrep:has_order order:order_iri (Order_tbl.Order_num) where ( ^{Salesrep_tbl.}^.Sales_Rep = ^{Order_tbl.}^.Sales_Rep ) as virtrdf:Salesrep_has_order ; salesrep:manages_region state:state_iri (State_tbl.State) where ( ^{Salesrep_tbl.}^.Region = ^{State_tbl.}^.Region ) as virtrdf:Salesrep_manages_region ; salesrep:made_call refcall:ref-call_iri (Ref_Call_tbl.Call_Num) where ( ^{Salesrep_tbl.}^.Sales_Rep = ^{Ref_Call_tbl.}^.Sales_Rep ) as virtrdf:Ref-Call_made_call . state:state_iri (State_tbl.State) a state:State as virtrdf:state_pk ; state:State_ State_tbl.State as virtrdf:State_state ; state:State-Name State_tbl.State_Name as virtrdf:State_state-name ; state:Region State_tbl.Region as virtrdf:State_region ; state:has_customer customer:customer_iri (Customer_tbl.Cust_Num) where ( ^{State_tbl.}^.State = ^{Customer_tbl.}^.State ) as virtrdf:State_has_customer ; state:has_sales_rep salesrep:salesrep_iri (Salesrep_tbl.Sales_Rep) where ( ^{State_tbl.}^.Region = ^{Salesrep_tbl.}^.Region ) as virtrdf:State_has_sales_rep . } . } . ; -- Setup re-write rules that enable de-referencing of RDF based descriptions of -- iSports Entities -- Cleanup old rules delete from db.dba.url_rewrite_rule_list where urrl_list like 'progress_isports_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'progress_isports_rule%'; -- Create rules for handling HTML representation of Entity (resource) description requests DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'progress_isports_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); -- Create rules for handling RDF based representations (N3 or RDF/XML) of Entity (resource) descriptions DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'progress_isports_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=DESCRIBE+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+%%3Chttp%%3A//localhost%%3A8890%U%%23this%%3E+FROM+%%3Chttp%%3A//localhost%%3A8890/progress/isports%%3E&format=%U', vector('path', 'path', '*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'progress_isports_rule_list1', 1, vector ( 'progress_isports_rule1', 'progress_isports_rule2' )); -- Setup OWL ontology data space that describes iSports entities -- Create Virtual Directory access point VHOST_REMOVE (lpath=>'/progress/isports'); VHOST_DEFINE ( lpath=>'/progress/isports', ppath=>'/DAV/progress/isports/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'progress_isports_rule_list1') ); delete from db.dba.url_rewrite_rule_list where urrl_list like 'progress_isports_schemas_rule%'; delete from db.dba.url_rewrite_rule where urr_rule like 'progress_isports_schemas_rule%'; DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'progress_isports_schemas_rule1', 1, '(/[^#]*)', vector('path'), 1, '/about/html/http/^{URIQADefaultHost}^%s', vector('path'), null, '(text/html)|(\\*/\\*)', 0, 303 ); DB.DBA.URLREWRITE_CREATE_REGEX_RULE ( 'progress_isports_schemas_rule2', 1, '(/[^#]*)', vector('path'), 1, '/sparql?query=CONSTRUCT+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}%%0D%%0AFROM+%%3Chttp%%3A//localhost%%3A8890/schemas/progress/isports%%3E+%%0D%%0AWHERE+{+%%3Chttp%%3A//localhost%%3A8890%U%%3E+%%3Fp+%%3Fo+}&format=%U', vector('path','path','*accept*'), null, '(text/rdf.n3)|(application/rdf.xml)', 0, null ); DB.DBA.URLREWRITE_CREATE_RULELIST ( 'progress_isports_schemas_rule_list1', 1, vector ( 'progress_isports_schemas_rule1', 'progress_isports_schemas_rule2' )); -- ensure a VD for the IRIs which begins with / VHOST_REMOVE (lpath=>'/schemas/progress/isports'); VHOST_DEFINE ( lpath=>'/schemas/progress/isports', ppath=>'/DAV/schemas/progress/isports/', is_dav=>1, vsp_user=>'dba', is_brws=>0, opts=>vector ('url_rewrite', 'progress_isports_schemas_rule_list1') ); DB.DBA.XML_SET_NS_DECL ('customer', 'http://^{URIQADefaultHost}^/schemas/progress/isports/customer/', 2); DB.DBA.XML_SET_NS_DECL ('order', 'http://^{URIQADefaultHost}^/schemas/progress/isports/order/', 2); DB.DBA.XML_SET_NS_DECL ('item', 'http://^{URIQADefaultHost}^/schemas/progress/isports/item/', 2); DB.DBA.XML_SET_NS_DECL ('orderline', 'http://^{URIQADefaultHost}^/schemas/progress/isports/order_line/', 2); DB.DBA.XML_SET_NS_DECL ('invoice', 'http://^{URIQADefaultHost}^/schemas/progress/isports/invoice/', 2); DB.DBA.XML_SET_NS_DECL ('localdefault', 'http://^{URIQADefaultHost}^/schemas/progress/isports/local_default/', 2); DB.DBA.XML_SET_NS_DECL ('refcall', 'http://^{URIQADefaultHost}^/schemas/progress/isports/ref_call/', 2); DB.DBA.XML_SET_NS_DECL ('salesrep', 'http://^{URIQADefaultHost}^/schemas/progress/isports/salesrep/', 2); DB.DBA.XML_SET_NS_DECL ('state', 'http://^{URIQADefaultHost}^/schemas/progress/isports/state/', 2);
Here is example of the basic Northwind RDF Views deployment. The sequence of operations is very common for adding SPARQL access to existing application.
There exist few important questions to answer. Who should have access to data behind RDF View? Should someone have access to other sorts of RDF data but not to the new View? What are applications that should be interoperable with the new RDF data source? Are there any applications that produce similar data but that data sould be kept apart from data made by view? How to ensure that deployment the view will not cause problems for other applications?
First of all, we decide whether the default web service endpoint should have access to the data in question. If it should then we have to grant SELECT privileges to the account "SPARQL" that is used for the default endpoint; if it should not but some custom edpoint should then grant to the owner account of that account. Granting access is less trivial that it is usual. On one hand, those who can make SQL SELECT statements on application's tables can also make SPARQL queries on RDF View over that tables, because it makes SQL inside. On the other hand, those who do not intend to query that data at all may get unexpected "permission denied" errors on queries that worked fine before adding an RDF View. If SPARQL compiler can not prove that the query can not access data from the view then it will generate SQL code that will access tables behind the view. In some cases permission problems should be resolved by creating RDF View in a separate RDF storage. In this example, data are public:
use DB; GRANT SELECT ON "Demo"."demo"."Products" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Suppliers" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Shippers" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Categories" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Customers" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Employees" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Orders" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Order_Details" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Countries" TO "SPARQL"; GRANT SELECT ON "Demo"."demo"."Provinces" TO "SPARQL";
Interoperability is the next question. The example is not interoperable with anything so in can provide data of any form, a real application will probably use some ontology from external source. Sometimes data should be converted from internal application's representation to something different (such as metric to imperial or ATT country code to two-character country id); sometimes composed IRIs should follow special rules; function-based IRI classes may help in that cases. As this is the first example, only plain format-string-based IRI classes are used.
We should also ensure that data generated by the new view will not be accidentally mixed with other data of the database. For that purpose the example will use a unique graph name that includes both application name and host name. In addition, the script will drop declarations that might remain from a previous run of the same script. The script is executed many times during the development so erasing previous version is worth writing. It will report an error if there's nothing to erase but it's better than unpredictable errors due to writing new declarations over existing ones.
Making graph name unique for every host is not needed if the application is supposed to be "local" and nobody will access more than one installation of the application. If this is the case, use some fixed graph IRI, not necessarily starting with hostname at all; this is much more convenient for querying because you don't have to calculate the graph name in each query. With fixed graph in use, it is still possible to clone the RDF View to map to a unique graph as soon as the application become "public" and requires merging data from many installations.
SPARQL drop quad map graph iri("http://^{URIQADefaultHost}^/Northwind") ; SPARQL drop quad map virtrdf:NorthwindDemo ;
The ^{URIQADefaultHost}^ macro is replaced with the value of DefaultHost parameter of [URIQA] section of configuration file. The IRI is written as iri("http://^{URIQADefaultHost}^/Northwind"), not as <http://^{URIQADefaultHost}^/Northwind> because macro of this sort works only inside SPARQL string values.
Now it's safe to create IRI classes needed for the view. If these classes are used only in the view we define then it is safe to create all of them in a single statement. If some of them are used across multiple declarations then errors may occur. it is impossible to redefine an IRI class that is in use; the compiler will try to avoid reporting errors by checking whether the new declaration is identical to the existing one and by trying garbage collection in hope that the IRI class is used only in garbage, but errors may occur anyway. Thus it is better to declare "shared" IRI classes by individual statements and group together only "private" IRI classes of a view. If a "class redefinition" error occurs in the middle of a group then "undefined class" errors may occur after because the processing of the group was interrupted before rest of group was not executed. When in trouble, try DB.DBA.RDF_AUDIT_METADATA procedure.
SPARQL create iri class northwind:Category "http://^{URIQADefaultHost}^/Northwind/Category/%d#this" (in category_id integer not null) . create iri class northwind:Shipper "http://^{URIQADefaultHost}^/Northwind/Shipper/%d#this" (in shipper_id integer not null) . create iri class northwind:Supplier "http://^{URIQADefaultHost}^/Northwind/Supplier/%d#this" (in supplier_id integer not null) . create iri class northwind:Product "http://^{URIQADefaultHost}^/Northwind/Product/%d#this" (in product_id integer not null) . create iri class northwind:Customer "http://^{URIQADefaultHost}^/Northwind/Customer/%U#this" (in customer_id varchar not null) . create iri class northwind:Employee "http://^{URIQADefaultHost}^/Northwind/Employee/%U%U%d#this" (in employee_firstname varchar not null, in employee_lastname varchar not null, in employee_id integer not null) . create iri class northwind:Order "http://^{URIQADefaultHost}^/Northwind/Order/%d#this" (in order_id integer not null) . create iri class northwind:CustomerContact "http://^{URIQADefaultHost}^/Northwind/CustomerContact/%U#this" (in customer_id varchar not null) . create iri class northwind:OrderLine "http://^{URIQADefaultHost}^/Northwind/OrderLine/%d/%d#this" (in order_id integer not null, in product_id integer not null) . create iri class northwind:Province "http://^{URIQADefaultHost}^/Northwind/Province/%U/%U#this" (in country_name varchar not null, in province_name varchar not null) . create iri class northwind:Country "http://^{URIQADefaultHost}^/Northwind/Country/%U#this" (in country_name varchar not null) . create iri class northwind:Flag "http://^{URIQADefaultHost}^%U#this" (in flag_path varchar not null) . create iri class northwind:dbpedia_iri "http://dbpedia.org/resource/%U" (in uname varchar not null) . create iri class northwind:EmployeePhoto "http://^{URIQADefaultHost}^/DAV/VAD/demo/sql/EMP%d#this" (in emp_id varchar not null) . create iri class northwind:CategoryPhoto "http://^{URIQADefaultHost}^/DAV/VAD/demo/sql/CAT%d#this" (in category_id varchar not null) . ;
One IRI class per subject type; format strings begin with same host but different directory names so this will let the compiler to guess the type of subject by the text of IRI. Most of declarations are bijections and may get option (bijection) hint but these format strings are so simple that the compiler may understand it by itself. (northwind:Employee is not a bijection because sprintf_inverse will be unable to split the tail of IRI string and find the boundary between first and last name.)
The final operation is extending the default quad storage with new tree of quad map patterns.
SPARQL prefix northwind: <http://demo.openlinksw.com/schemas/northwind#> prefix oplsioc: <http://www.openlinksw.com/schemas/oplsioc#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix sioc: <http://rdfs.org/sioc/ns#> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix owl: <http://www.w3.org/2002/07/owl#> prefix wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#> alter quad storage virtrdf:DefaultQuadStorage from Demo.demo.Products as products from Demo.demo.Suppliers as suppliers from Demo.demo.Shippers as shippers from Demo.demo.Categories as categories from Demo.demo.Customers as customers from Demo.demo.Employees as employees from Demo.demo.Orders as orders from Demo.demo.Order_Details as order_lines from Demo.demo.Countries as countries from Demo.demo.Provinces as provinces where (^{suppliers.}^.Country = ^{countries.}^.Name) where (^{customers.}^.Country = ^{countries.}^.Name) where (^{employees.}^.Country = ^{countries.}^.Name) where (^{orders.}^.ShipCountry = ^{countries.}^.Name) { create virtrdf:NorthwindDemo as graph iri ("http://^{URIQADefaultHost}^/Northwind") option (exclusive) { northwind:CustomerContact (customers.CustomerID) a foaf:Person as virtrdf:CustomerContact-foaf_Person . northwind:CustomerContact (customers.CustomerID) a northwind:CustomerContact as virtrdf:CustomerContact-CustomerContact; foaf:name customers.ContactName as virtrdf:CustomerContact-contact_name ; foaf:phone customers.Phone as virtrdf:CustomerContact-foaf_phone ; northwind:is_contact_at northwind:Customer (customers.CustomerID) as virtrdf:CustomerContact-is_contact_at ; northwind:country northwind:Country (customers.Country) as virtrdf:CustomerContact-country ; rdfs:isDefinedBy northwind:customercontact_iri (customers.CustomerID) ; rdfs:isDefinedBy northwind:CustomerContact (customers.CustomerID) . northwind:Country (customers.Country) northwind:is_country_of northwind:CustomerContact (customers.CustomerID) as virtrdf:CustomerContact-is_country_of . northwind:Product (products.ProductID) a northwind:Product as virtrdf:Product-ProductID ; northwind:has_category northwind:Category (products.CategoryID) as virtrdf:Product-product_has_category ; northwind:has_supplier northwind:Supplier (products.SupplierID) as virtrdf:Product-product_has_supplier ; northwind:productName products.ProductName as virtrdf:Product-name_of_product ; northwind:quantityPerUnit products.QuantityPerUnit as virtrdf:Product-quantity_per_unit ; northwind:unitPrice products.UnitPrice as virtrdf:Product-unit_price ; northwind:unitsInStock products.UnitsInStock as virtrdf:Product-units_in_stock ; northwind:unitsOnOrder products.UnitsOnOrder as virtrdf:Product-units_on_order ; northwind:reorderLevel products.ReorderLevel as virtrdf:Product-reorder_level ; northwind:discontinued products.Discontinued as virtrdf:Product-discontinued ; rdfs:isDefinedBy northwind:product_iri (products.ProductID) ; rdfs:isDefinedBy northwind:Product (products.ProductID) . northwind:Category (products.CategoryID) northwind:category_of northwind:Product (products.ProductID) as virtrdf:Product-category_of . northwind:Supplier (products.SupplierID) northwind:supplier_of northwind:Product (products.ProductID) as virtrdf:Product-supplier_of . northwind:Supplier (suppliers.SupplierID) a northwind:Supplier as virtrdf:Supplier-SupplierID ; northwind:companyName suppliers.CompanyName as virtrdf:Supplier-company_name ; northwind:contactName suppliers.ContactName as virtrdf:Supplier-contact_name ; northwind:contactTitle suppliers.ContactTitle as virtrdf:Supplier-contact_title ; northwind:address suppliers.Address as virtrdf:Supplier-address ; northwind:city suppliers.City as virtrdf:Supplier-city ; northwind:dbpedia_city northwind:dbpedia_iri(suppliers.City) as virtrdf:Supplier-dbpediacity ; northwind:region suppliers.Region as virtrdf:Supplier-region ; northwind:postalCode suppliers.PostalCode as virtrdf:Supplier-postal_code ; northwind:country northwind:Country(suppliers.Country) as virtrdf:Supplier-country ; northwind:phone suppliers.Phone as virtrdf:Supplier-phone ; northwind:fax suppliers.Fax as virtrdf:Supplier-fax ; northwind:homePage suppliers.HomePage as virtrdf:Supplier-home_page ; rdfs:isDefinedBy northwind:supplier_iri (suppliers.SupplierID) ; rdfs:isDefinedBy northwind:Supplier (suppliers.SupplierID) . northwind:Country (suppliers.Country) northwind:is_country_of northwind:Supplier (suppliers.SupplierID) as virtrdf:Supplier-is_country_of . northwind:Category (categories.CategoryID) a northwind:Category as virtrdf:Category-CategoryID ; northwind:categoryName categories.CategoryName as virtrdf:Category-home_page ; northwind:description categories.Description as virtrdf:Category-description ; foaf:img northwind:CategoryPhoto(categories.CategoryID) as virtrdf:Category-categories.CategoryPhoto ; rdfs:isDefinedBy northwind:category_iri (categories.CategoryID) ; rdfs:isDefinedBy northwind:Category (categories.CategoryID) . northwind:CategoryPhoto(categories.CategoryID) a northwind:CategoryPhoto as virtrdf:Category-categories.CategoryPhotoID ; rdfs:isDefinedBy northwind:categoryphoto_iri (categories.CategoryID) ; rdfs:isDefinedBy northwind:CategoryPhoto(categories.CategoryID) . northwind:Shipper (shippers.ShipperID) a northwind:Shipper as virtrdf:Shipper-ShipperID ; northwind:companyName shippers.CompanyName as virtrdf:Shipper-company_name ; northwind:phone shippers.Phone as virtrdf:Shipper-phone ; rdfs:isDefinedBy northwind:shipper_iri (shippers.ShipperID) ; rdfs:isDefinedBy northwind:Shipper (shippers.ShipperID) . northwind:Customer (customers.CustomerID) a northwind:Customer as virtrdf:Customer-CustomerID2 ; a foaf:Organization as virtrdf:Customer-CustomerID ; foaf:name customers.CompanyName as virtrdf:Customer-foaf_name ; northwind:companyName customers.CompanyName as virtrdf:Customer-company_name ; northwind:has_contact northwind:CustomerContact (customers.CustomerID) as virtrdf:Customer-contact ; northwind:country northwind:Country (customers.Country) as virtrdf:Customer-country ; northwind:contactName customers.ContactName as virtrdf:Customer-contact_name ; northwind:contactTitle customers.ContactTitle as virtrdf:Customer-contact_title ; northwind:address customers.Address as virtrdf:Customer-address ; northwind:city customers.City as virtrdf:Customer-city ; northwind:dbpedia_city northwind:dbpedia_iri(customers.City) as virtrdf:Customer-dbpediacity ; northwind:region customers.Region as virtrdf:Customer-region ; northwind:PostalCode customers.PostalCode as virtrdf:Customer-postal_code ; foaf:phone customers.Phone as virtrdf:Customer-foaf_phone ; northwind:phone customers.Phone as virtrdf:Customer-phone ; northwind:fax customers.Fax as virtrdf:Customer-fax ; rdfs:isDefinedBy northwind:customer_iri (customers.CustomerID) ; rdfs:isDefinedBy northwind:Customer (customers.CustomerID) . northwind:Country (customers.Country) northwind:is_country_of northwind:Customer (customers.CustomerID) as virtrdf:Customer-is_country_of . northwind:Employee (employees.FirstName, employees.LastName, employees.EmployeeID) a northwind:Employee as virtrdf:Employee-EmployeeID2 ; a foaf:Person as virtrdf:Employee-EmployeeID ; foaf:surname employees.LastName as virtrdf:Employee-foaf_last_name ; northwind:lastName employees.LastName as virtrdf:Employee-last_name ; foaf:firstName employees.FirstName as virtrdf:Employee-foaf_first_name ; northwind:firstName employees.FirstName as virtrdf:Employee-first_name ; foaf:title employees.Title as virtrdf:Employee-title ; northwind:titleOfCourtesy employees.TitleOfCourtesy as virtrdf:Employee-title_of_courtesy ; foaf:birthday employees.BirthDate as virtrdf:Employee-foaf_birth_date ; northwind:birthday employees.BirthDate as virtrdf:Employee-birth_date ; northwind:hireDate employees.HireDate as virtrdf:Employee-hire_date ; northwind:address employees.Address as virtrdf:Employee-address ; northwind:city employees.City as virtrdf:Employee-city ; northwind:dbpedia_city northwind:dbpedia_iri(employees.City) as virtrdf:Employee-dbpediacity ; northwind:region employees.Region as virtrdf:Employee-region ; northwind:postalCode employees.PostalCode as virtrdf:Employee-postal_code ; northwind:country northwind:Country(employees.Country) as virtrdf:Employee-country ; foaf:phone employees.HomePhone as virtrdf:Employee-home_phone ; northwind:extension employees.Extension as virtrdf:Employee-extension ; northwind:notes employees.Notes as virtrdf:Employee-notes ; northwind:reportsTo northwind:Employee(employees.FirstName, employees.LastName, employees.ReportsTo) where (^{employees.}^.ReportsTo = ^{employees.}^.EmployeeID) as virtrdf:Employee-reports_to ; foaf:img northwind:EmployeePhoto(employees.EmployeeID) as virtrdf:Employee-employees.EmployeePhoto ; rdfs:isDefinedBy northwind:employee_iri (employees.EmployeeID) ; rdfs:isDefinedBy northwind:Employee (employees.FirstName, employees.LastName, employees.EmployeeID) . northwind:EmployeePhoto(employees.EmployeeID) a northwind:EmployeePhoto as virtrdf:Employee-employees.EmployeePhotoId ; rdfs:isDefinedBy northwind:employeephoto_iri (employees.EmployeeID) ; rdfs:isDefinedBy northwind:EmployeePhoto (employees.EmployeeID) . northwind:Employee (employees.FirstName, employees.LastName, orders.EmployeeID) northwind:is_salesrep_of northwind:Order (orders.OrderID) where (^{orders.}^.EmployeeID = ^{employees.}^.EmployeeID) as virtrdf:Order-is_salesrep_of . northwind:Country (employees.Country) northwind:is_country_of northwind:Employee (employees.FirstName, employees.LastName, employees.EmployeeID) as virtrdf:Employee-is_country_of . northwind:Order (orders.OrderID) a northwind:Order as virtrdf:Order-Order ; northwind:has_customer northwind:Customer (orders.CustomerID) as virtrdf:Order-order_has_customer ; northwind:has_salesrep northwind:Employee (employees.FirstName, employees.LastName, orders.EmployeeID) where (^{orders.}^.EmployeeID = ^{employees.}^.EmployeeID) as virtrdf:Customer-has_salesrep ; northwind:has_employee northwind:Employee (employees.FirstName, employees.LastName, orders.EmployeeID) where (^{orders.}^.EmployeeID = ^{employees.}^.EmployeeID) as virtrdf:Order-order_has_employee ; northwind:orderDate orders.OrderDate as virtrdf:Order-order_date ; northwind:requiredDate orders.RequiredDate as virtrdf:Order-required_date ; northwind:shippedDate orders.ShippedDate as virtrdf:Order-shipped_date ; northwind:order_ship_via northwind:Shipper (orders.ShipVia) as virtrdf:Order-order_ship_via ; northwind:freight orders.Freight as virtrdf:Order-freight ; northwind:shipName orders.ShipName as virtrdf:Order-ship_name ; northwind:shipAddress orders.ShipAddress as virtrdf:Order-ship_address ; northwind:shipCity orders.ShipCity as virtrdf:Order-ship_city ; northwind:dbpedia_shipCity northwind:dbpedia_iri(orders.ShipCity) as virtrdf:Order-dbpediaship_city ; northwind:shipRegion orders.ShipRegion as virtrdf:Order-ship_region ; northwind:shipPostal_code orders.ShipPostalCode as virtrdf:Order-ship_postal_code ; northwind:shipCountry northwind:Country(orders.ShipCountry) as virtrdf:ship_country ; rdfs:isDefinedBy northwind:order_iri (orders.OrderID) ; rdfs:isDefinedBy northwind:Order (orders.OrderID) . northwind:Country (orders.ShipCountry) northwind:is_ship_country_of northwind:Order (orders.OrderID) as virtrdf:Order-is_country_of . northwind:Customer (orders.CustomerID) northwind:has_order northwind:Order (orders.OrderID) as virtrdf:Order-has_order . northwind:Shipper (orders.ShipVia) northwind:ship_order northwind:Order (orders.OrderID) as virtrdf:Order-ship_order . northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) a northwind:OrderLine as virtrdf:OrderLine-OrderLines ; northwind:has_order_id northwind:Order (order_lines.OrderID) as virtrdf:order_lines_has_order_id ; northwind:has_product_id northwind:Product (order_lines.ProductID) as virtrdf:order_lines_has_product_id ; northwind:unitPrice order_lines.UnitPrice as virtrdf:OrderLine-unit_price ; northwind:quantity order_lines.Quantity as virtrdf:OrderLine-quantity ; northwind:discount order_lines.Discount as virtrdf:OrderLine-discount ; rdfs:isDefinedBy northwind:orderline_iri (order_lines.OrderID, order_lines.ProductID) ; rdfs:isDefinedBy northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) . northwind:Order (orders.OrderID) northwind:is_order_of northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) where (^{orders.}^.OrderID = ^{order_lines.}^.OrderID) as virtrdf:Order-is_order_of . northwind:Product (products.ProductID) northwind:is_product_of northwind:OrderLine (order_lines.OrderID, order_lines.ProductID) where (^{products.}^.ProductID = ^{order_lines.}^.ProductID) as virtrdf:Product-is_product_of . northwind:Country (countries.Name) a northwind:Country as virtrdf:Country-Type2 ; a wgs:SpatialThing as virtrdf:Country-Type ; owl:sameAs northwind:dbpedia_iri (countries.Name) ; northwind:name countries.Name as virtrdf:Country-Name ; northwind:code countries.Code as virtrdf:Country-Code ; northwind:smallFlagDAVResourceName countries.SmallFlagDAVResourceName as virtrdf:Country-SmallFlagDAVResourceName ; northwind:largeFlagDAVResourceName countries.LargeFlagDAVResourceName as virtrdf:Country-LargeFlagDAVResourceName ; northwind:smallFlagDAVResourceURI northwind:Flag(countries.SmallFlagDAVResourceURI) as virtrdf:Country-SmallFlagDAVResourceURI ; northwind:largeFlagDAVResourceURI northwind:Flag(countries.LargeFlagDAVResourceURI) as virtrdf:Country-LargeFlagDAVResourceURI ; wgs:lat countries.Lat as virtrdf:Country-Lat ; wgs:long countries.Lng as virtrdf:Country-Lng ; rdfs:isDefinedBy northwind:country_iri (countries.Name) ; rdfs:isDefinedBy northwind:Country (countries.Name) . northwind:Country (countries.Name) northwind:has_province northwind:Province (provinces.CountryCode, provinces.Province) where (^{provinces.}^.CountryCode = ^{countries.}^.Code) as virtrdf:Country-has_province . northwind:Province (provinces.CountryCode, provinces.Province) a northwind:Province as virtrdf:Province-Provinces ; northwind:has_country_code provinces.CountryCode as virtrdf:has_country_code ; northwind:provinceName provinces.Province as virtrdf:Province-ProvinceName ; rdfs:isDefinedBy northwind:province_iri (provinces.CountryCode, provinces.Province) ; rdfs:isDefinedBy northwind:Province (provinces.CountryCode, provinces.Province) . northwind:Province (provinces.CountryCode, provinces.Province) northwind:is_province_of northwind:Country (countries.Name) where (^{countries.}^.Code = ^{provinces.}^.CountryCode) as virtrdf:Province-country_of . }. }. ;
The created RDF View is sufficient for querying relational data via SPARQL but not for accessing data by dereferencing IRIs of subjects. Making IRIs dereferenceable requires configuring HTTP server; that is explained in second part of the example.
Previous
RDF Insert Methods in Virtuoso |
Chapter Contents |
Next
Linked Data |