¶
16.8.11. Oracle Demonstration 'HR' Database
Live links to a sample instance
Script to set up your own instance
-- Setup script for Linked Data 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://example.com/schemas/oraclehr/> .
hr:countries a rdfs:Class ;
rdfs:isDefinedBy <http://example.com/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://example.com/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://example.com/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://example.com/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://example.com/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://example.com/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://example.com/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://example.com/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://example.com/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://example.com/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://example.com/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://example.com/schemas/oraclehr/countries_iri>
"http://^{URIQADefaultHost}^/oraclehr/countries/%s#this"
(in COUNTRY_ID varchar not null) .
create iri class <http://example.com/schemas/oraclehr/regions_iri>
"http://^{URIQADefaultHost}^/oraclehr/regions/%d#this"
(in REGION_ID integer not null) .
create iri class <http://example.com/schemas/oraclehr/departments_iri>
"http://^{URIQADefaultHost}^/oraclehr/departments/%d#this"
(in DEPARTMENT_ID integer not null) .
create iri class <http://example.com/schemas/oraclehr/employees_iri>
"http://^{URIQADefaultHost}^/oraclehr/employees/%d#this"
(in EMPLOYEE_ID integer not null) .
create iri class <http://example.com/schemas/oraclehr/jobs_iri>
"http://^{URIQADefaultHost}^/oraclehr/jobs/%s#this"
(in JOB_ID varchar not null) .
create iri class <http://example.com/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://example.com/oraclehr/job_history/%d_%s#this") .
create iri class <http://example.com/schemas/oraclehr/locations_iri>
"http://^{URIQADefaultHost}^/oraclehr/locations/%d#this"
(in LOCATION_ID integer not null) .
;
--------------------------------------------------------------------
------------- Create Quad Store ------------------------------------
SPARQL
prefix hr: <http://example.com/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://example.com/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);