Singleton Property Reasoning
From Knoesis wiki
Contents
[hide]Downloads
The packages are available for download at sourceforge.net
LUBM-SP: http://sourceforge.net/projects/graphke/files/lubmsp_1.0.0.jar/download
LUBM-SP ontology: http://sourceforge.net/projects/graphke/files/lubmsp_onto.nt/download
SPARQL queries http://sourceforge.net/projects/graphke/files/queries.tar.gz/download
Jena Query evaluation http://sourceforge.net/projects/graphke/files/lubmsp_query_eval_1.0.0.jar/download
Instructions
Setting up files
1. mkdir lubmsp 2. cd lubmsp 3. Download all the files provided in the Download section above into this folder 4. tar -xzvf queries.tar.gz 5. You may want to install the rlwrap package for command history
Here we explain the step-by-step to generate the LUBM-SP datasets, and run the query evaluation
Generating LUBM and LUBM-SP datasets
1. cd lubmsp 2. Run the code, the number of university may be 50, 500, or 1000 java -jar lubmsp_1.0.0.jar -univ 500 -index 0 -onto http://knoesis.org/lubmsp 3. Check for three data files generated LUBM_500.nt: the original LUBM in the form of ntriples LUBM_500_sp.nt: the LUBM-SP in the form of ntriples LUBM_500.rdf: the original LUBM in the form of RDF/XML
Query evaluation in Jena
1. cd lubmsp 2. java -jar lubmsp_query_eval_1.0.0.jar or rlwrap java -jar lubmsp_query_eval_1.0.0.jar reasoner: rdfs ontology: lubmsp_onto.nt instances: LUBM_500_sp.nt query: queries/lubm_query1.sparql
Preparing Oracle 12c
1. Download and install Oracle database 12c to $ORACLE_HOME 2. Download and install Oracle client: sqlplus 3. Create one Oracle instance using dbca 4. Connect to sqlplus sqlplus / as sysdba 5. Execute the two files $ORACLE_HOME/md/admin/catsem.sql and $ORACLE_HOME/md/admin/sdordfwm.sql SQL> @'?/md/admin/catsem.sql' SQL> @'?/md/admin/sdordfwm.sql' 6. Create a tablespace rdf_tblspace 7. Create a semantic network on the tablespace rdf_tblspace
Loading data to Oracle 12c
There are different ways to load data into Oracle. Here we use the bulk load from staging table method.
Below is the sample code for loading LUBM_500_sp.nt to Oracle
connect user/pass set timing on create table stable_lubmsp_500 ( RDF$STC_sub varchar2(4000) not null, RDF$STC_pred varchar2(4000) not null, RDF$STC_obj varchar2(4000) not null); grant SELECT on stable_lubmsp_500 to MDSYS; CREATE TABLE RDF$ET_TAB_LUBMSP_500 ( proc_sid VARCHAR2(30), proc_sig VARCHAR2(200), event_name varchar2(200), start_time timestamp, end_time timestamp, start_comment varchar2(1000) DEFAULT NULL, end_comment varchar2(1000) DEFAULT NULL ); GRANT INSERT on RDF$ET_TAB_LUBM_500 to MDSYS; host sqlldr userid=user/pass control=/path/to/lubmsp/bulkload_lubmsp_500.ctl data=/path/to/lubmsp/LUBM_500_sp.nt direct=true rows=10000000 skip_index_maintenance=true skip=0 load=1000000000 discardmax=1000000 bad=d0.bad discard=d0.rej log=d0.log errors=1000000 host sqlldr userid=user/pass control=/path/to/lubmsp/bulkload_lubmsp_500.ctl data=/path/to/lubmsp/lubmsp_onto.nt direct=true skip=0 load=1000000000 discardmax=1000000 bad=d0.bad discard=d0.rej log=d0.log errors=1000000 commit; create table atab_lubmsp_500 (triple sdo_rdf_triple_s); exec sem_apis.create_sem_model('LUBMSP_500_MODEL', 'ATAB_LUBMSP_500', 'TRIPLE'); grant INSERT,UPDATE on atab_lubmsp_500 to MDSYS; exec sem_apis.bulk_load_from_staging_table(model_name=>'LUBMSP_500_MODEL', table_owner=>'user', table_name=>'stable_lubmsp_500'); commit; select count(*) from table(sem_match('{?s ?p ?o}', SEM_MODELS('LUBMSP_500_MODEL'), NULL, NULL, NULL)); INSERT INTO ATAB_LUBMSP_500 VALUES ( SDO_RDF_TRIPLE_S('LUBMSP_500_MODEL', '<http://www.w3.org/1999/02/22-rdf-syntax-ns#singletonPropertyOf>', '<http://www.w3.org/2000/01/rdf-schema#subPropertyOf>', '<http://www.w3.org/2000/01/rdf-schema#subPropertyOf>')); commit; EXEC SEM_APIS.CREATE_ENTAILMENT('rdfs_rix_lubmsp_500', SEM_Models('LUBMSP_500_MODEL'), SEM_Rulebases('RDFS')); commit;
This is an example of the control file for bulkload_lubmsp_500.ctl
UNRECOVERABLE LOAD DATA APPEND into table stable_lubmsp_500 when (1) <> '#' ( RDF$STC_sub CHAR(4000) terminated by whitespace "( CASE WHEN substr(:RDF$STC_sub,1,1)='<' AND substr(:RDF$STC_sub,-1,1)='>' AND length(:RDF$STC_sub)>2 THEN :RDF$STC_sub WHEN substr(:RDF$STC_sub,1,2)='_:' AND REGEXP_LIKE(:RDF$STC_sub,'^(_:)[[:alpha:]][[:alnum:]]*$') THEN :RDF$STC_sub WHEN substr(:RDF$STC_sub,1,1) NOT IN ('\"','<','#') AND substr(:RDF$STC_sub,-1,1) NOT IN ('\"','>') THEN ('<' || SDO_RDF.replace_rdf_prefix(:RDF$STC_sub) || '>') WHEN substr(:RDF$STC_sub,1,1)='#' THEN SDO_RDF.raise_parse_error( 'Ignored Comment Line starting with ', :RDF$STC_sub) ELSE SDO_RDF.raise_parse_error('Invalid Subject', :RDF$STC_sub) END )", RDF$STC_pred CHAR(4000) terminated by whitespace "( CASE WHEN substr(:RDF$STC_pred,1,1)='<' AND substr(:RDF$STC_pred,-1,1)='>' AND length(:RDF$STC_pred)>2 THEN :RDF$STC_pred WHEN substr(:RDF$STC_pred,1,2) != '_:' AND substr(:RDF$STC_pred,1,1) NOT IN ('\"','<') AND substr(:RDF$STC_pred,-1,1) NOT IN ('\"','>') THEN ('<' || SDO_RDF.replace_rdf_prefix(:RDF$STC_pred) || '>') ELSE SDO_RDF.raise_parse_error('Invalid Predicate', :RDF$STC_pred) END )", -- -- right-trimming of WHITESPACEs is reqd for "RDF$STC_obj" -- (due to absence of "TERMINATED BY WHITESPACE") -- -- For ease of editing below replace -- "rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13))" with ":xy". -- and then replace back -- RDF$STC_obj CHAR(5000) "( CASE WHEN substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),1,1)='<' AND substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),-1,1)='>' AND length(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)))>2 THEN rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)) WHEN substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),1,1)='\"' AND substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),-1,1)='\"' AND length(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)))>1 THEN rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)) WHEN substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),1,2)='_:' AND REGEXP_LIKE(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)), '^(_:)[[:alpha:]][[:alnum:]]*$') THEN rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)) WHEN substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),1,1) NOT IN ('\"','<') AND substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),-1,1) NOT IN ('\"','>') THEN ('<' || SDO_RDF.replace_rdf_prefix( rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13))) || '>') WHEN substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),1,1)='\"' AND substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),-1,1) NOT IN ('\"','>') AND instr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),'\"\@',-1)>1 AND REGEXP_LIKE(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)), '^\"[[:print:]]*\"\@[[:alpha:]]+(-[[:alnum:]]+)*$') THEN rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)) WHEN (substr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),1,1)='\"' AND instr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),'\"^^',-1)>1 AND (length(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)))- (instr(rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13)),'\"^^',-1)+4) )>0) THEN SDO_RDF.pov_typed_literal( rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13))) ELSE SDO_RDF.raise_parse_error( 'Invalid Object', rtrim(:RDF$STC_obj,'. '||CHR(9)||CHR(10)||CHR(13))) END )" )
Query evaluation in Oracle 12c
# Query 1 From LUBM-Query1 # This query bears large input and high selectivity. It queries about just one class and # one property and does not assume any hierarchy information or SQL> SELECT X FROM TABLE(SEM_MATCH( '{ ?X rdf:type ub:GraduateStudent . ?X ub:takesCourse <http://www.Department0.University0.edu/GraduateCourse0>}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
# Query2 From LUBM-Query2 # This query increases in complexity: 3 classes and 3 properties are involved. Additionally, # there is a triangular pattern of relationships between the objects involved. SQL> SELECT X, Y, Z FROM TABLE(SEM_MATCH( '{ ?X rdf:type ub:GraduateStudent . ?Y rdf:type ub:University . ?Z rdf:type ub:Department . ?X ub:memberOf ?Z . ?Z ub:subOrganizationOf ?Y . ?X ub:undergraduateDegreeFrom ?Y}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query 3 SQL> SELECT X FROM TABLE(SEM_MATCH( '{ ?X rdf:type ub:Publication . ?X ub:publicationAuthor <http://www.Department0.University0.edu/AssistantProfessor0>}', SEM_Models('LUBMSP_500_MODEL'), null, SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query4 SQL> SELECT distinct X, Y1, Y2, Y3 FROM TABLE(SEM_MATCH( '{ ?X rdf:type ub:Professor . ?X ub:worksFor <http://www.Department0.University0.edu> . ?X ub:name ?Y1 . ?X ub:emailAddress ?Y2 . ?X ub:telephone ?Y3}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query5 SQL> SELECT X FROM TABLE(SEM_MATCH( '{?X rdf:type ub:Person . ?X ub:memberOf <http://www.Department0.University0.edu>}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query 6 SQL> SELECT X FROM TABLE(SEM_MATCH( '{ ?X rdf:type ub:Student}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query7 SQL> SELECT X, Y FROM TABLE(SEM_MATCH( '{ ?X rdf:type ub:Student . ?Y rdf:type ub:Course . ?X ub:takesCourse ?Y . <http://www.Department0.University0.edu/AssociateProfessor0> ub:teacherOf ?Y}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query8 SQL> SELECT X, Y, Z FROM TABLE(SEM_MATCH( '{?X rdf:type ub:Student . ?Y rdf:type ub:Department . ?X ub:memberOf ?Y . ?Y ub:subOrganizationOf <http://www.University0.edu> . ?X ub:emailAddress ?Z}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query9 SQL> SELECT X, Y, Z FROM TABLE(SEM_MATCH( '{?X rdf:type ub:Student . ?Y rdf:type ub:Faculty . ?Z rdf:type ub:Course . ?X ub:advisor ?Y . ?Y ub:teacherOf ?Z . ?X ub:takesCourse ?Z}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query10 SQL> SELECT X FROM TABLE(SEM_MATCH( '{?X rdf:type ub:Student . ?X ub:takesCourse <http://www.Department0.University0.edu/GraduateCourse0>}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query 11 SQL> SELECT X FROM TABLE(SEM_MATCH( '{?X rdf:type ub:ResearchGroup . ?X ub:subOrganizationOf <http://www.University0.edu>}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query 12 SQL> SELECT X, Y FROM TABLE(SEM_MATCH( '{?X rdf:type ub:Chair . ?Y rdf:type ub:Department . ?X ub:worksFor ?Y . ?Y ub:subOrganizationOf <http://www.University0.edu>}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query 13 SQL> SELECT X FROM TABLE(SEM_MATCH( '{?X rdf:type ub:Person . <http://www.University0.edu> ub:hasAlumnus ?X}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
LUBM-Query 14 SQL> SELECT X FROM TABLE(SEM_MATCH( '{ ?X rdf:type ub:UndergraduateStudent}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
Query 2-Mixed SQL> SELECT X, Y, Z, T FROM TABLE(SEM_MATCH( '{ ?X rdf:type ub:GraduateStudent . ?Y rdf:type ub:University . ?Z rdf:type ub:Department . ?X ub:memberOf ?Z . ?Z ub:subOrganizationOf ?Y . ?X ?sp ?Y . ?sp rdf:singletonPropertyOf ub:undergraduateDegreeFrom . ?sp ub:happened ?T}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
Query 7-Mixed SQL> SELECT X, Y, S, E FROM TABLE(SEM_MATCH( '{ ?X rdf:type ub:Student . ?Y rdf:type ub:Course . ?X ub:takesCourse ?Y . <http://www.Department0.University0.edu/AssociateProfessor0> ?sp ?Y . ?sp rdf:singletonPropertyOf ub:teacherOf . ?sp ub:started ?S . ?sp ub:ended ?E }', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));
Query9-Mixed SQL> SELECT X, Y, Z, S, E FROM TABLE(SEM_MATCH( '{?X rdf:type ub:Student . ?Y rdf:type ub:Faculty . ?Z rdf:type ub:Course . ?X ub:advisor ?Y . ?Y ub:teacherOf ?Z . ?X ?sp ?Z . ?sp rdf:singletonPropertyOf ub:takesCourse . ?sp ub:started ?S . ?sp ub:ended ?E .}', SEM_Models('LUBMSP_500_MODEL'), SDO_RDF_Rulebases('RDFS'), SEM_ALIASES(SEM_ALIAS('ub','http://knoesis.org/lubmsp#')), null));