/libsrc/Wi/sparql.sql
https://github.com/XixiLuo/virtuoso-opensource · SQL · 17566 lines · 15959 code · 657 blank · 950 comment · 3103 complexity · 9f0d15e8b932454fa58f529fe45da796 MD5 · raw file
Large files are truncated click here to view the full file
- --
- -- $Id$
- --
- -- This file is part of the OpenLink Software Virtuoso Open-Source (VOS)
- -- project.
- --
- -- Copyright (C) 1998-2014 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
- --
- --
- create table DB.DBA.RDF_QUAD (
- G IRI_ID_8,
- S IRI_ID_8,
- P IRI_ID_8,
- O any,
- primary key (P, S, O, G) column
- )
- alter index RDF_QUAD on DB.DBA.RDF_QUAD partition (S int (0hexffff00))
- create distinct no primary key ref column index RDF_QUAD_SP on DB.DBA.RDF_QUAD (S, P) partition (S int (0hexffff00))
- create column index RDF_QUAD_POGS on DB.DBA.RDF_QUAD (P, O, S, G) partition (O varchar (-1, 0hexffff))
- create distinct no primary key ref column index RDF_QUAD_GS on DB.DBA.RDF_QUAD (G, S) partition (S int (0hexffff00))
- create distinct no primary key ref column index RDF_QUAD_OP on DB.DBA.RDF_QUAD (O, P) partition (O varchar (-1, 0hexffff))
- ;
- create table DB.DBA.RDF_QUAD_RECOV_TMP (
- G1 IRI_ID_8, S1 IRI_ID_8, P1 IRI_ID_8, O1 any, primary key (P1, S1, O1, G1) column)
- alter index RDF_QUAD_RECOV_TMP on DB.DBA.RDF_QUAD_RECOV_TMP partition (S1 int (0hexffff00))
- create column index RDF_QUAD_RECOV_TMP_POGS on DB.DBA.RDF_QUAD_RECOV_TMP (P1, O1, G1, S1) partition (O1 varchar (-1, 0hexffff))
- create distinct no primary key ref column index RDF_QUAD_RECOV_TMP_OP on DB.DBA.RDF_QUAD_RECOV_TMP (O1, P1) partition (O1 varchar (-1, 0hexffff))
- ;
- create function DB.DBA.RDF_MAKE_IID_OF_QNAME_SAFE (in qname any) returns IRI_ID
- {
- return iri_to_id_nosignal (qname);
- }
- ;
- create function DB.DBA.RDF_MAKE_IID_OF_QNAME_COMP (in qname any) returns IRI_ID
- {
- return iri_to_id_nosignal (qname, 0);
- }
- ;
- create function DB.DBA.RDF_QNAME_OF_IID (in iid IRI_ID) returns varchar -- DEPRECATED
- {
- return id_to_iri_nosignal (iid);
- }
- ;
- DB.DBA.RDF_MAKE_IID_OF_QNAME_SAFE (null)
- ;
- DB.DBA.RDF_MAKE_IID_OF_QNAME_COMP (null)
- ;
- DB.DBA.RDF_QNAME_OF_IID (null)
- ;
- --create trigger DB.DBA.RDF_QUAD_O_AUDIT before insert on DB.DBA.RDF_QUAD
- --{
- -- if (not rdf_box_is_storeable (O))
- -- signal ('RDFXX', 'non-storeable O');
- --}
- --;
- create table DB.DBA.RDF_OBJ (
- RO_ID bigint primary key,
- RO_VAL varchar not null,
- RO_LONG long varchar,
- RO_FLAGS smallint not null default 0,
- RO_DT_AND_LANG integer not null default 16843009 compress any
- )
- alter index RDF_OBJ on RDF_OBJ partition (RO_ID int (0hexffff00))
- create index RO_VAL on DB.DBA.RDF_OBJ (RO_VAL, RO_DT_AND_LANG)
- partition (RO_VAL varchar (-4, 0hexffff))
- ;
- create table DB.DBA.RO_START (RS_START varchar, RS_DT_AND_LANG int, RS_RO_ID any,
- primary key (RS_START, RS_DT_AND_LANG, RS_RO_ID))
- alter index RO_START on DB.DBA.RO_START partition (RS_RO_ID varchar (-1, 0hexffff))
- ;
- --create table DB.DBA.RDF_FT (
- -- RF_ID bigint primary key,
- -- RF_O any)
- --alter index RDF_FT on RDF_FT partition (RF_ID int (0hexffff00))
- --create index RF_O on RDF_FT (RF_O) partition (RF_O varchar (-1, 0hexffff))
- --;
- create table DB.DBA.RDF_DATATYPE (
- RDT_IID IRI_ID_8 not null primary key,
- RDT_TWOBYTE integer not null unique,
- RDT_QNAME varchar not null unique )
- alter index RDF_DATATYPE on RDF_DATATYPE partition cluster replicated
- alter index DB_DBA_RDF_DATATYPE_UNQC_RDT_TWOBYTE on RDF_DATATYPE partition cluster replicated
- alter index DB_DBA_RDF_DATATYPE_UNQC_RDT_QNAME on RDF_DATATYPE partition cluster replicated
- ;
- create table DB.DBA.RDF_LANGUAGE (
- RL_ID varchar not null primary key,
- RL_TWOBYTE integer not null unique )
- alter index RDF_LANGUAGE on RDF_LANGUAGE partition cluster replicated
- alter index DB_DBA_RDF_LANGUAGE_UNQC_RL_TWOBYTE on RDF_LANGUAGE partition cluster replicated
- ;
- create table DB.DBA.SYS_SPARQL_HOST (
- SH_HOST varchar not null primary key,
- SH_GRAPH_URI varchar,
- SH_USER_URI varchar,
- SH_BASE_URI varchar,
- SH_DEFINES long varchar
- )
- ;
- alter table DB.DBA.SYS_SPARQL_HOST add SH_BASE_URI varchar
- ;
- create table DB.DBA.RDF_OBJ_FT_RULES (
- ROFR_G varchar not null,
- ROFR_P varchar not null,
- ROFR_REASON varchar not null,
- primary key (ROFR_G, ROFR_P, ROFR_REASON) )
- alter index RDF_OBJ_FT_RULES on RDF_OBJ_FT_RULES partition cluster replicated
- ;
- create table DB.DBA.SYS_SPARQL_SW_LOG (
- PL_SERVER varchar,
- PL_URI varchar,
- PL_TS timestamp,
- PL_RC varchar,
- PL_MSG long varchar,
- primary key (PL_SERVER, PL_URI, PL_TS))
- ;
- create table DB.DBA.SYS_XML_PERSISTENT_NS_DECL
- (
- NS_PREFIX varchar not null primary key,
- NS_URL varchar not null
- )
- alter index SYS_XML_PERSISTENT_NS_DECL on SYS_XML_PERSISTENT_NS_DECL partition cluster replicated
- ;
- create table DB.DBA.RDF_EXPLICITLY_CREATED_GRAPH
- (
- REC_GRAPH_IID IRI_ID not null primary key
- )
- alter index RDF_EXPLICITLY_CREATED_GRAPH on RDF_EXPLICITLY_CREATED_GRAPH partition cluster replicated
- ;
- create table RDF_GEO (X real no compress, Y real no compress,X2 real no compress, Y2 real no compress, ID bigint no compress, primary key (X, Y, X2, Y2, ID))
- alter index RDF_GEO on RDF_GEO partition (ID int (0hexffff00))
- ;
- create table DB.DBA.RDF_LABEL (RL_O any primary key, RL_RO_ID bigint, RL_TEXT varchar, RL_LANG int)
- alter index RDF_LABEL on RDF_LABEL partition (RL_O varchar (-1, 0hexffff))
- create index RDF_LABEL_TEXT on RDF_LABEL (RL_TEXT, RL_O) partition (RL_TEXT varchar (6, 0hexffff))
- ;
- create table DB.DBA.RDF_QUAD_DELETE_QUEUE (
- EVENT_ID bigint not null,
- RULE_ID bigint not null,
- QG IRI_ID not null,
- QS IRI_ID not null,
- QP IRI_ID not null,
- QO any not null,
- primary key (EVENT_ID, RULE_ID, QG, QS, QP, QO)
- )
- ;
- create table DB.DBA.SYS_IDONLY_EMPTY
- (
- ID integer not null primary key
- )
- ;
- create table DB.DBA.SYS_IDONLY_ONE
- (
- ID integer not null primary key
- )
- ;
- insert soft DB.DBA.SYS_IDONLY_ONE (ID) values (0)
- ;
- sequence_set ('RDF_URL_IID_NAMED', 1000000, 1)
- ;
- sequence_set ('RDF_PREF_SEQ', 1, 1)
- ;
- sequence_set ('RDF_URL_IID_BLANK', iri_id_num (min_bnode_iri_id ()), 1)
- ;
- sequence_set ('RDF_URL_IID_NAMED_BLANK', iri_id_num (min_named_bnode_iri_id ()), 1)
- ;
- sequence_set ('RDF_RO_ID', 1, 1)
- ;
- sequence_set ('RDF_DATATYPE_TWOBYTE', 258, 1)
- ;
- sequence_set ('RDF_LANGUAGE_TWOBYTE', 258, 1)
- ;
- create procedure RDF_QUAD_FT_INIT ()
- {
- if (not exists (select 1 from SYS_VT_INDEX where VI_COL = 'o'))
- {
- insert soft SYS_VT_INDEX (VI_TABLE, VI_INDEX, VI_COL, VI_ID_COL, VI_INDEX_TABLE, VI_ID_IS_PK, VI_OPTIONS)
- values ('DB.DBA.RDF_QUAD', 'RDF_QUAD_OP', 'O', 'O', 'DB.DBA.RDF_GEO', 1, 'GR');
- insert soft SYS_VT_INDEX (VI_TABLE, VI_INDEX, VI_COL, VI_ID_COL, VI_INDEX_TABLE, VI_ID_IS_PK, VI_OPTIONS)
- values ('DB.DBA.RDF_QUAD', 'RDF_QUAD_OP', 'o', 'O', 'DB.DBA.RDF_OBJ_RO_FLAGS_WORDS', 1, null);
- __ddl_changed ('DB.DBA.RDF_QUAD');
- }
- }
- ;
- create procedure DB.DBA.RDF_OBJ_RO_FLAGS_INDEX_HOOK (inout vtb any, inout d_id any)
- {
- if (cl_current_slice () = 0hexffff)
- {
- for (select RO_LONG, RO_VAL, RO_FLAGS
- from DB.DBA.RDF_OBJ where RO_ID=d_id and bit_and (RO_FLAGS, 1)) do
- {
- if (bit_and (RO_FLAGS, 2))
- vt_batch_feed (vtb, xml_tree_doc (__xml_deserialize_packed (RO_LONG)), 0);
- else
- vt_batch_feed (vtb, coalesce (RO_LONG, RO_VAL), 0);
- }
- }
- else
- {
- for (select RO_LONG, RO_VAL, RO_FLAGS
- from DB.DBA.RDF_OBJ table option (no cluster) where RO_ID=d_id and bit_and (RO_FLAGS, 1)) do
- {
- if (bit_and (RO_FLAGS, 2))
- vt_batch_feed (vtb, xml_tree_doc (__xml_deserialize_packed (RO_LONG)), 0);
- else
- vt_batch_feed (vtb, coalesce (RO_LONG, RO_VAL), 0);
- }
- }
- return 1;
- }
- ;
- create procedure DB.DBA.RDF_OBJ_RO_FLAGS_UNINDEX_HOOK (inout vtb any, inout d_id any)
- {
- if (cl_current_slice () = 0hexffff)
- {
- for (select RO_LONG, RO_VAL, RO_FLAGS
- from DB.DBA.RDF_OBJ where RO_ID=d_id and bit_and (RO_FLAGS, 1)) do
- {
- if (bit_and (RO_FLAGS, 2))
- vt_batch_feed (vtb, xml_tree_doc (__xml_deserialize_packed (RO_LONG)), 1);
- else
- vt_batch_feed (vtb, coalesce (RO_LONG, RO_VAL), 1);
- }
- }
- else
- {
- for (select RO_LONG, RO_VAL, RO_FLAGS
- from DB.DBA.RDF_OBJ table option (no cluster) where RO_ID=d_id and bit_and (RO_FLAGS, 1)) do
- {
- if (bit_and (RO_FLAGS, 2))
- vt_batch_feed (vtb, xml_tree_doc (__xml_deserialize_packed (RO_LONG)), 1);
- else
- vt_batch_feed (vtb, coalesce (RO_LONG, RO_VAL), 1);
- }
- }
- return 1;
- }
- ;
- create procedure sparql_exec_quiet (in expn varchar)
- {
- declare sta, msg varchar;
- exec (expn, sta, msg);
- }
- ;
- sparql_exec_quiet ('DB.DBA.vt_create_text_index (
- fix_identifier_case (''DB.DBA.RDF_OBJ''),
- fix_identifier_case (''RO_FLAGS''),
- fix_identifier_case (''RO_ID''),
- 0, 0, vector (), 1, ''*ini*'', ''UTF-8-QR'')')
- ;
- sparql_exec_quiet ('DB.DBA.vt_batch_update (fix_identifier_case (''DB.DBA.RDF_OBJ''), ''ON'', 1)')
- ;
- --sparql_exec_quiet ('alter index VTLOG_DB_DBA_RDF_OBJ on VTLOG_DB_DBA_RDF_OBJ partition (VTLOG_RO_ID int (0hexffff00))')
- --;
- --!AWK PUBLIC
- create function DB.DBA.XML_SET_NS_DECL (in prefix varchar, in url varchar, in persist integer := 1) returns integer
- {
- declare res integer;
- res := __xml_set_ns_decl (prefix, url, persist);
- if (bit_and (res, 2))
- {
- declare exit handler for sqlstate '*' { __xml_remove_ns_by_prefix (prefix, persist); resignal; };
- if (exists (select 1 from DB.DBA.SYS_XML_PERSISTENT_NS_DECL where NS_PREFIX = prefix and NS_URL = url))
- return;
- delete from DB.DBA.SYS_XML_PERSISTENT_NS_DECL where NS_PREFIX = prefix;
- insert into DB.DBA.SYS_XML_PERSISTENT_NS_DECL (NS_PREFIX, NS_URL) values (prefix, url);
- commit work;
- }
- return res;
- }
- ;
- --!AWK PUBLIC
- create procedure DB.DBA.XML_REMOVE_NS_BY_PREFIX (in prefix varchar, in persist integer := 1)
- {
- declare res integer;
- __xml_remove_ns_by_prefix (prefix, persist);
- if (bit_and (persist, 2))
- {
- whenever sqlstate '*' goto again;
- again:
- delete from DB.DBA.SYS_XML_PERSISTENT_NS_DECL where NS_PREFIX=prefix;
- commit work;
- }
- }
- ;
- --!AWK PUBLIC
- create procedure DB.DBA.XML_CLEAR_ALL_NS_DECLS (in persist integer := 1)
- {
- declare res integer;
- __xml_clear_all_ns_decls (persist);
- if (bit_and (persist, 2))
- {
- whenever sqlstate '*' goto again;
- again:
- delete from DB.DBA.SYS_XML_PERSISTENT_NS_DECL;
- commit work;
- }
- }
- ;
- --!AWK PUBLIC
- create procedure DB.DBA.XML_SELECT_ALL_NS_DECLS (in persist integer := 3)
- {
- declare decls any;
- declare ctr, len integer;
- declare PREFIX, URI varchar;
- decls := __xml_get_all_ns_decls (persist);
- result_names (PREFIX, URI);
- len := length (decls);
- for (ctr := 0; ctr < len; ctr := ctr + 2)
- result (decls[ctr], decls[ctr+1]);
- }
- ;
- create procedure DB.DBA.XML_LOAD_ALL_NS_DECLS ()
- {
- for (select NS_PREFIX, NS_URL from DB.DBA.SYS_XML_PERSISTENT_NS_DECL) do
- {
- __xml_set_ns_decl (NS_PREFIX, NS_URL, 2);
- }
- DB.DBA.XML_SET_NS_DECL ( 'bif' , 'bif:' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'dawgt' , 'http://www.w3.org/2001/sw/DataAccess/tests/test-dawg#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'dbpedia' , 'http://dbpedia.org/resource/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'dbpprop' , 'http://dbpedia.org/property/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'dc' , 'http://purl.org/dc/elements/1.1/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'go' , 'http://purl.org/obo/owl/GO#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'geo' , 'http://www.w3.org/2003/01/geo/wgs84_pos#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'fn' , 'http://www.w3.org/2005/xpath-functions/#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'foaf' , 'http://xmlns.com/foaf/0.1/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'obo' , 'http://www.geneontology.org/formats/oboInOwl#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'ogc' , 'http://www.opengis.net/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'ogcgml' , 'http://www.opengis.net/ont/gml#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'ogcgs' , 'http://www.opengis.net/ont/geosparql#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'ogcgsf' , 'http://www.opengis.net/def/function/geosparql/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'ogcgsr' , 'http://www.opengis.net/def/rule/geosparql/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'ogcsf' , 'http://www.opengis.net/ont/sf#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'owl' , 'http://www.w3.org/2002/07/owl#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'mesh' , 'http://purl.org/commons/record/mesh/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'math' , 'http://www.w3.org/2000/10/swap/math#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'mf' , 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'nci' , 'http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'product' , 'http://www.buy.com/rss/module/productV2/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'protseq' , 'http://purl.org/science/protein/bysequence/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'rdf' , 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'rdfa' , 'http://www.w3.org/ns/rdfa#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'rdfdf' , 'http://www.openlinksw.com/virtrdf-data-formats#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'rdfs' , 'http://www.w3.org/2000/01/rdf-schema#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'sc' , 'http://purl.org/science/owl/sciencecommons/' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'sd' , 'http://www.w3.org/ns/sparql-service-description#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'sioc' , 'http://rdfs.org/sioc/ns#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'skos' , 'http://www.w3.org/2004/02/skos/core#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'sql' , 'sql:' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'vcard' , 'http://www.w3.org/2001/vcard-rdf/3.0#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'vcard2006' , 'http://www.w3.org/2006/vcard/ns#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'virtrdf' , 'http://www.openlinksw.com/schemas/virtrdf#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'virtcxml' , 'http://www.openlinksw.com/schemas/virtcxml#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'void' , 'http://rdfs.org/ns/void#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'xf' , 'http://www.w3.org/2004/07/xpath-functions' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'xml' , 'http://www.w3.org/XML/1998/namespace' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'xsd' , 'http://www.w3.org/2001/XMLSchema#' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'xsl10' , 'http://www.w3.org/XSL/Transform/1.0' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'xsl1999' , 'http://www.w3.org/1999/XSL/Transform' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'xslwd' , 'http://www.w3.org/TR/WD-xsl' , 2);
- DB.DBA.XML_SET_NS_DECL ( 'yago' , 'http://dbpedia.org/class/yago/' , 2);
- }
- ;
- DB.DBA.XML_LOAD_ALL_NS_DECLS ()
- ;
- rdf_inf_const_init ()
- ;
- create procedure DB.DBA.RDF_LOAD_ALL_FT_RULES ()
- {
- whenever sqlstate '*' goto again;
- again:
- for (select ROFR_G as rule_g, ROFR_P as rule_p, ROFR_REASON as reason from DB.DBA.RDF_OBJ_FT_RULES) do
- {
- declare rule_g_iid, rule_p_iid IRI_ID;
- rule_g_iid := case (rule_g) when '' then null else iri_to_id (rule_g) end;
- rule_p_iid := case (rule_p) when '' then null else iri_to_id (rule_p) end;
- -- dbg_obj_princ ('__rdf_obj_ft_rule_add (', rule_g_iid, rule_p_iid, reason, ')');
- __rdf_obj_ft_rule_add (rule_g_iid, rule_p_iid, reason);
- }
- }
- ;
- DB.DBA.RDF_LOAD_ALL_FT_RULES ()
- ;
- create procedure DB.DBA.RDF_REPL_START (in quiet integer := 0)
- {
- if (repl_this_server () is null)
- return;
- if (isstring (registry_get ('DB.DBA.RDF_REPL')))
- {
- if (quiet)
- return;
- signal ('RDF99', 'RDF replication is already enabled');
- }
- for (select RGGM_MEMBER_IID from DB.DBA.RDF_GRAPH_GROUP_MEMBER
- where RGGM_GROUP_IID = iri_to_id (UNAME'http://www.openlinksw.com/schemas/virtrdf#rdf_repl_graph_group')
- and not __rgs_ack_cbk (RGGM_MEMBER_IID, __rdf_repl_uid(), 1) ) do
- {
- signal ('RDF99', 'RDF replication can not be enabled because it will violate security rules for read access to graph <' || id_to_iri(RGGM_MEMBER_IID) || '> by __rdf_repl account');
- }
- repl_publish ('__rdf_repl', '__rdf_repl.log');
- repl_text ('__rdf_repl', '__rdf_repl_flush_queue()');
- DB.DBA.RDF_GRAPH_GROUP_CREATE (UNAME'http://www.openlinksw.com/schemas/virtrdf#rdf_repl_graph_group', 1);
- DB.DBA.CL_EXEC ('registry_set (?,?)', vector ('DB.DBA.RDF_REPL', cast (now() as varchar)));
- exec ('checkpoint');
- }
- ;
- create procedure DB.DBA.RDF_REPL_STOP (in quiet integer := 0)
- {
- if (not isstring (registry_get ('DB.DBA.RDF_REPL')))
- {
- if (quiet)
- return;
- signal ('RDF99', 'RDF replication is not enabled');
- }
- repl_unpublish ('__rdf_repl');
- DB.DBA.CL_EXEC ('registry_remove (?)', vector ('DB.DBA.RDF_REPL'));
- }
- ;
- create procedure DB.DBA.RDF_REPL_GRAPH_INS (in memb_iri varchar)
- {
- declare memb_iid IRI_ID;
- memb_iid := iri_to_id (memb_iri);
- memb_iri := id_to_iri (memb_iid);
- DB.DBA.RDF_GRAPH_GROUP_INS (UNAME'http://www.openlinksw.com/schemas/virtrdf#rdf_repl_graph_group', memb_iri);
- }
- ;
- create procedure DB.DBA.RDF_REPL_GRAPH_DEL (in memb_iri varchar)
- {
- declare memb_iid IRI_ID;
- DB.DBA.RDF_GRAPH_GROUP_DEL (UNAME'http://www.openlinksw.com/schemas/virtrdf#rdf_repl_graph_group', memb_iri);
- }
- ;
- create procedure DB.DBA.RDF_REPL_SYNC (in publisher varchar, in u varchar, in pwd varchar)
- {
- declare lvl, stat integer;
- if (repl_this_server () is null)
- return;
- commit work;
- retr:
- repl_sync (publisher, '__rdf_repl', u, pwd);
- again:
- repl_status (publisher, '__rdf_repl', lvl, stat);
- if (0 = stat)
- {
- __rdf_repl_flush_queue();
- return;
- }
- if (1 = stat)
- {
- delay (0.1);
- goto again;
- }
- if (2 = stat)
- {
- __rdf_repl_flush_queue();
- return;
- }
- goto retr;
- }
- ;
- create procedure DB.DBA.RDF_REPL_INSERT_TRIPLES (in graph_iri varchar, inout triples any)
- {
- declare ctr integer;
- for (ctr := length (triples) - 1; ctr >= 0; ctr := ctr - 1)
- {
- declare s_iri, p_iri, o_val, o_type, o_lang any;
- s_iri := iri_canonicalize (triples[ctr][0]);
- p_iri := iri_canonicalize (triples[ctr][1]);
- o_val := triples[ctr][2];
- if (isiri_id (o_val))
- __rdf_repl_quad (84, graph_iri, s_iri, p_iri, iri_canonicalize (o_val));
- else if (__tag of rdf_box <> __tag (o_val))
- __rdf_repl_quad (80, graph_iri, s_iri, p_iri, o_val);
- else
- {
- declare dt_twobyte, lang_twobyte integer;
- dt_twobyte := rdf_box_type (o_val);
- lang_twobyte := rdf_box_lang (o_val);
- if (257 <> dt_twobyte)
- __rdf_repl_quad (81, graph_iri, s_iri, p_iri, rdf_box_data (o_val), (select RDT_QNAME from DB.DBA.RDF_DATATYPE where RDT_TWOBYTE = dt_twobyte), NULL);
- else if (257 <> lang_twobyte)
- __rdf_repl_quad (82, graph_iri, s_iri, p_iri, rdf_box_data (o_val), NULL, (select RL_ID from DB.DBA.RDF_LANGUAGE where RL_TWOBYTE = lang_twobyte));
- else
- __rdf_repl_quad (80, graph_iri, s_iri, p_iri, rdf_box_data (o_val));
- }
- }
- }
- ;
- create procedure DB.DBA.RDF_REPL_DELETE_TRIPLES (in graph_iri varchar, inout triples any)
- {
- declare ctr integer;
- for (ctr := length (triples) - 1; ctr >= 0; ctr := ctr - 1)
- {
- declare s_iri, p_iri, o_val, o_type, o_lang any;
- s_iri := iri_canonicalize (triples[ctr][0]);
- p_iri := iri_canonicalize (triples[ctr][1]);
- o_val := triples[ctr][2];
- if (isiri_id (o_val))
- __rdf_repl_quad (164, graph_iri, s_iri, p_iri, iri_canonicalize (o_val));
- else if (__tag of rdf_box <> __tag (o_val))
- __rdf_repl_quad (160, graph_iri, s_iri, p_iri, o_val);
- else
- {
- declare dt_twobyte, lang_twobyte integer;
- dt_twobyte := rdf_box_type (o_val);
- lang_twobyte := rdf_box_lang (o_val);
- if (257 <> dt_twobyte)
- __rdf_repl_quad (161, graph_iri, s_iri, p_iri, rdf_box_data (o_val), (select RDT_QNAME from DB.DBA.RDF_DATATYPE where RDT_TWOBYTE = dt_twobyte), NULL);
- else if (257 <> lang_twobyte)
- __rdf_repl_quad (162, graph_iri, s_iri, p_iri, rdf_box_data (o_val), NULL, (select RL_ID from DB.DBA.RDF_LANGUAGE where RL_TWOBYTE = lang_twobyte));
- else
- __rdf_repl_quad (160, graph_iri, s_iri, p_iri, rdf_box_data (o_val));
- }
- }
- }
- ;
- --!AFTER
- create procedure DB.DBA.RDF_GLOBAL_RESET (in hard integer := 0)
- {
- if (isstring (registry_get ('DB.DBA.RDF_REPL')))
- {
- signal ('42RDF', 'Can not make DB.DBA.RDF_GLOBAL_RESET while an RDF replication is enabled');
- }
- -- checkpoint;
- __atomic (1);
- iri_id_cache_flush ();
- __rdf_obj_ft_rule_zap_all ();
- dict_zap (__rdf_graph_group_dict(), 2);
- dict_zap (__rdf_graph_group_of_privates_dict(), 2);
- dict_zap (__rdf_graph_default_perms_of_user_dict(0), 2);
- dict_zap (__rdf_graph_default_perms_of_user_dict(1), 2);
- dict_zap (__rdf_graph_public_perms_dict(), 2);
- for select RS_NAME from DB.DBA.SYS_RDF_SCHEMA do
- rdf_inf_clear (RS_NAME);
- delete from sys_rdf_schema;
- delete from DB.DBA.RDF_QUAD;
- delete from DB.DBA.RDF_OBJ_FT_RULES;
- delete from DB.DBA.RDF_GRAPH_GROUP;
- for (select __id2i(t.RGU_GRAPH_IID) as graph_iri from (select distinct RGU_GRAPH_IID from DB.DBA.RDF_GRAPH_USER) as t) do
- {
- if (graph_iri is not null)
- {
- jso_mark_affected (graph_iri);
- log_text ('jso_mark_affected (?)', graph_iri);
- jso_mark_affected (iri_canonicalize (graph_iri));
- log_text ('jso_mark_affected (?)', iri_canonicalize (graph_iri));
- log_text ('jso_mark_affected (iri_canonicalize (?))', graph_iri);
- }
- }
- for (select __id2i(t.RGGM_GROUP_IID) as group_iri from (select distinct RGGM_GROUP_IID from DB.DBA.RDF_GRAPH_GROUP_MEMBER) as t) do
- {
- if (group_iri is not null)
- {
- jso_mark_affected (group_iri);
- log_text ('jso_mark_affected (?)', group_iri);
- }
- }
- for (select __id2i(RGGM_MEMBER_IID) as memb_iri from DB.DBA.RDF_GRAPH_GROUP_MEMBER where RGGM_GROUP_IID = __i2id ('http://www.openlinksw.com/schemas/virtrdf#PrivateGraphs')) do
- {
- if (memb_iri is not null)
- {
- jso_mark_affected (memb_iri);
- log_text ('jso_mark_affected (?)', memb_iri);
- }
- }
- for (sparql define input:storage "" select distinct str (?qms) as ?qms_iri from virtrdf: where { ?qms a virtrdf:QuadStorage } ) do
- {
- if ("qms_iri" is not null)
- {
- jso_mark_affected ("qms_iri");
- log_text ('jso_mark_affected (?)', "qms_iri");
- }
- }
- jso_mark_affected ('http://www.openlinksw.com/schemas/virtrdf#PrivateGraphs');
- log_text ('jso_mark_affected (?)', 'http://www.openlinksw.com/schemas/virtrdf#PrivateGraphs');
- jso_mark_affected ('http://www.openlinksw.com/schemas/virtrdf#DefaultQuadStorage');
- log_text ('jso_mark_affected (?)', 'http://www.openlinksw.com/schemas/virtrdf#DefaultQuadStorage');
- jso_mark_affected ('http://www.openlinksw.com/schemas/virtrdf#DefaultQuadMap');
- log_text ('jso_mark_affected (?)', 'http://www.openlinksw.com/schemas/virtrdf#DefaultQuadMap');
- delete from DB.DBA.RDF_GRAPH_GROUP_MEMBER;
- delete from DB.DBA.RDF_GRAPH_USER;
- delete from DB.DBA.RDF_LABEL;
- delete from DB.DBA.RDF_GEO;
- commit work;
- if (hard)
- {
- --delete from DB.DBA.RDF_URL;
- delete from DB.DBA.RDF_IRI;
- delete from DB.DBA.RDF_PREFIX;
- delete from DB.DBA.RDF_OBJ;
- delete from DB.DBA.RO_START;
- delete from DB.DBA.RDF_DATATYPE;
- delete from DB.DBA.RDF_LANGUAGE;
- --__rdf_twobyte_cache_zap();
- --log_text ('__rdf_twobyte_cache_zap()');
- delete from DB.DBA.VTLOG_DB_DBA_RDF_OBJ;
- delete from DB.DBA.RDF_OBJ_RO_FLAGS_WORDS;
- sequence_set ('RDF_URL_IID_NAMED', 1000000, 0);
- sequence_set ('RDF_URL_IID_BLANK', iri_id_num (min_bnode_iri_id ()), 0);
- sequence_set ('RDF_URL_IID_NAMED_BLANK', iri_id_num (min_named_bnode_iri_id ()), 0);
- sequence_set ('RDF_PREF_SEQ', 1, 0);
- sequence_set ('RDF_RO_ID', 1, 0);
- sequence_set ('RDF_DATATYPE_TWOBYTE', 258, 0);
- sequence_set ('RDF_LANGUAGE_TWOBYTE', 258, 0);
- __atomic (0);
- exec ('checkpoint');
- raw_exit ();
- }
- sequence_set ('RDF_URL_IID_NAMED', 1000000, 1);
- sequence_set ('RDF_URL_IID_BLANK', iri_id_num (min_bnode_iri_id ()), 1);
- sequence_set ('RDF_URL_IID_NAMED_BLANK', iri_id_num (min_named_bnode_iri_id ()), 1);
- sequence_set ('RDF_PREF_SEQ', 1, 1);
- sequence_set ('RDF_RO_ID', 1, 1);
- sequence_set ('RDF_DATATYPE_TWOBYTE', 258, 1);
- sequence_set ('RDF_LANGUAGE_TWOBYTE', 258, 1);
- DB.DBA.RDF_LOAD_ALL_FT_RULES ();
- DB.DBA.TTLP (
- cast ( DB.DBA.XML_URI_GET (
- 'http://www.openlinksw.com/sparql/virtrdf-data-formats.ttl', '' ) as varchar ),
- '', 'http://www.openlinksw.com/schemas/virtrdf#' );
- DB.DBA.TTLP ('
- @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
- @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
- @prefix owl: <http://www.w3.org/2002/07/owl#> .
- @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
- @prefix virtrdf: <http://www.openlinksw.com/schemas/virtrdf#> .
- @prefix rdfdf: <http://www.openlinksw.com/virtrdf-data-formats#> .
- @prefix atom: <http://atomowl.org/ontologies/atomrdf#> .
- virtrdf:DefaultQuadStorage
- rdf:type virtrdf:QuadStorage ;
- virtrdf:qsUserMaps virtrdf:DefaultQuadStorage-UserMaps ;
- virtrdf:qsDefaultMap virtrdf:DefaultQuadMap ;
- virtrdf:qsMatchingFlags virtrdf:SPART_QS_NO_IMPLICIT_USER_QM .
- virtrdf:DefaultQuadStorage-UserMaps
- rdf:type virtrdf:array-of-QuadMap .
- virtrdf:DefaultServiceStorage
- rdf:type virtrdf:QuadStorage ;
- virtrdf:qsUserMaps virtrdf:DefaultServiceStorage-UserMaps ;
- virtrdf:qsDefaultMap virtrdf:DefaultServiceMap ;
- virtrdf:qsMatchingFlags virtrdf:SPART_QS_NO_IMPLICIT_USER_QM .
- virtrdf:DefaultServiceStorage-UserMaps
- rdf:type virtrdf:array-of-QuadMap .
- virtrdf:SyncToQuads
- rdf:type virtrdf:QuadStorage ;
- virtrdf:qsUserMaps virtrdf:SyncToQuads-UserMaps .
- virtrdf:SyncToQuads-UserMaps
- rdf:type virtrdf:array-of-QuadMap .
- ', '', 'http://www.openlinksw.com/schemas/virtrdf#' );
- delete from SYS_HTTP_SPONGE where HS_PARSER = 'DB.DBA.RDF_LOAD_HTTP_RESPONSE';
- commit work;
- sequence_set ('RDF_URL_IID_NAMED', 1010000, 1);
- sequence_set ('RDF_URL_IID_BLANK', iri_id_num (min_bnode_iri_id ()) + 10000, 1);
- sequence_set ('RDF_URL_IID_NAMED_BLANK', iri_id_num (min_named_bnode_iri_id ()) + 10000, 1);
- sequence_set ('RDF_PREF_SEQ', 101, 1);
- sequence_set ('RDF_RO_ID', 1001, 1);
- iri_id_cache_flush ();
- DB.DBA.SPARQL_RELOAD_QM_GRAPH ();
- __atomic (0);
- exec ('checkpoint');
- }
- ;
- -----
- -- Handling of IRI IDs
- create function DB.DBA.RDF_MAKE_IID_OF_QNAME (in qname varchar) returns IRI_ID
- {
- return iri_to_id (qname);
- }
- ;
- create function DB.DBA.RDF_MAKE_IID_OF_LONG (in qname any) returns IRI_ID -- DEPRECATED
- {
- if (isiri_id (qname))
- return qname;
- if (not isstring (qname))
- {
- if (__tag of rdf_box = __tag (qname) and rdf_box_is_complete (qname))
- qname := rdf_box_data (qname, 1);
- else
- qname := __rdf_strsqlval (qname);
- }
- return iri_to_id_nosignal (qname);
- }
- ;
- create function DB.DBA.RDF_MAKE_GRAPH_IIDS_OF_QNAMES (in qnames any) returns any
- {
- if (__tag of vector <> __tag (qnames))
- return vector ();
- declare res_acc any;
- vectorbld_init (res_acc);
- foreach (any qname in qnames) do
- {
- declare iid IRI_ID;
- whenever sqlstate '*' goto skip_acc;
- iid := iri_to_id (qname, 0, 0);
- if (not isinteger (iid))
- vectorbld_acc (res_acc, iid);
- skip_acc: ;
- }
- vectorbld_final (res_acc);
- return res_acc;
- }
- ;
- -----
- -- Datatypes and languages
- create function DB.DBA.RDF_TWOBYTE_OF_DATATYPE (in iid any) returns integer
- {
- declare res integer;
- declare qname varchar;
- if (iid is null)
- return 257;
- if (not isiri_id (iid))
- {
- declare new_iid IRI_ID;
- new_iid := iri_to_id (iid);
- if (new_iid is NULL or new_iid >= min_bnode_iri_id ())
- signal ('RDFXX', 'Invalid datatype IRI_ID passes as an argument to DB.DBA.RDF_TWOBYTE_OF_DATATYPE()');
- iid := new_iid;
- }
- qname := id_to_iri (iid);
- res := rdf_cache_id ('t', qname);
- if (res)
- return res;
- whenever not found goto mknew;
- set isolation='committed';
- select RDT_TWOBYTE into res from DB.DBA.RDF_DATATYPE where RDT_IID = iid;
- return res;
- mknew:
- set isolation='serializable';
- declare tb_cr cursor for select RDT_TWOBYTE from DB.DBA.RDF_DATATYPE where RDT_IID = iid;
- open tb_cr (exclusive);
- whenever not found goto mknew_ser;
- fetch tb_cr into res;
- return res;
- mknew_ser:
- res := sequence_next ('RDF_DATATYPE_TWOBYTE');
- if (0 = bit_and (res, 255))
- {
- if (res = 0hex7F00)
- {
- sequence_set ('RDF_DATATYPE_TWOBYTE', 0hex7F00, 0);
- res := 0hex7F01;
- qname := 'http://www.openlinksw.com/schemas/virtrdf#Unsaved';
- iid := iri_to_id (qname);
- insert soft DB.DBA.RDF_DATATYPE
- (RDT_IID, RDT_TWOBYTE, RDT_QNAME)
- values (iid, res, qname);
- goto cache_and_log;
- }
- res := sequence_next ('RDF_DATATYPE_TWOBYTE');
- }
- insert into DB.DBA.RDF_DATATYPE
- (RDT_IID, RDT_TWOBYTE, RDT_QNAME)
- values (iid, res, qname);
- cache_and_log:
- rdf_cache_id ('t', qname, res);
- log_text ('rdf_cache_id (\'t\', ?, ?)', qname, res); --'
- return res;
- }
- ;
- create function DB.DBA.RDF_PRESET_TWOBYTES_OF_DATATYPES ()
- {
- declare xsd_lnames any;
- xsd_lnames := vector (
- 'ENTITY',
- 'ENTITIES',
- 'ID',
- 'IDREF',
- 'IDREFS',
- 'NCName',
- 'Name',
- 'NMTOKEN',
- 'NMTOKENS',
- 'NOTATION',
- 'QName',
- 'any',
- 'anyAtomicType',
- 'anySimpleType',
- 'anyType',
- 'anyURI',
- 'base64Binary',
- 'boolean',
- 'byte',
- 'date',
- 'dateTime',
- 'dateTimeStamp',
- 'dayTimeDuration',
- 'decimal',
- 'double',
- 'duration',
- 'float',
- 'gDay',
- 'gMonth',
- 'gMonthDay',
- 'gYear',
- 'gYearMonth',
- 'hexBinary',
- 'int',
- 'integer',
- 'language',
- 'long',
- 'negativeInteger',
- 'nonNegativeInteger',
- 'nonPositiveInteger',
- 'normalizedString',
- 'positiveInteger',
- 'short',
- 'string',
- 'time',
- 'token',
- 'unsignedByte',
- 'unsignedInt',
- 'unsignedLong',
- 'unsignedShort',
- 'yearMonthDuration' );
- foreach (varchar n in xsd_lnames) do
- {
- __dbf_set ('rb_type__xsd:' || n, DB.DBA.RDF_TWOBYTE_OF_DATATYPE (iri_to_id ('http://www.w3.org/2001/XMLSchema#' || n)));
- }
- commit work;
- }
- ;
- DB.DBA.RDF_PRESET_TWOBYTES_OF_DATATYPES ()
- ;
- create function DB.DBA.RDF_TWOBYTE_OF_LANGUAGE (in id varchar) returns integer
- {
- declare res integer;
- if (id is null)
- return 257;
- id := lower (id);
- res := rdf_cache_id ('l', id);
- if (res)
- return res;
- whenever not found goto mknew;
- set isolation='committed';
- select RL_TWOBYTE into res from DB.DBA.RDF_LANGUAGE where RL_ID = id;
- return res;
- mknew:
- set isolation='serializable';
- declare tb_cr cursor for select RL_TWOBYTE from DB.DBA.RDF_LANGUAGE where RL_ID = id;
- open tb_cr (exclusive);
- whenever not found goto mknew_ser;
- fetch tb_cr into res;
- return res;
- mknew_ser:
- res := sequence_next ('RDF_LANGUAGE_TWOBYTE');
- if (0 = bit_and (res, 255))
- {
- if (res = 0hex7F00)
- {
- sequence_set ('RDF_LANGUAGE_TWOBYTE', 0hex7F00, 0);
- res := 0hex7F01;
- id := 'x-unsaved';
- insert soft DB.DBA.RDF_LANGUAGE (RL_ID, RL_TWOBYTE) values (id, res);
- goto cache_and_log;
- }
- res := sequence_next ('RDF_LANGUAGE_TWOBYTE');
- }
- insert into DB.DBA.RDF_LANGUAGE (RL_ID, RL_TWOBYTE) values (id, res);
- cache_and_log:
- rdf_cache_id ('l', id, res);
- log_text ('rdf_cache_id (\'l\', ?, ?)', id, res); --'
- return res;
- }
- ;
- -----
- -- Conversions from and to _table fields_ in short representation
- create function DB.DBA.RQ_LONG_OF_O (in o_col any) returns any -- DEPRECATED
- {
- return __rdf_long_of_obj (o_col);
- }
- ;
- create procedure DB.DBA.RDF_BOX_COMPLETE (inout o_col any) -- DEPRECATED
- {
- __rdf_box_make_complete (o_col);
- }
- ;
- create function DB.DBA.RQ_SQLVAL_OF_O (in o_col any) returns any -- DEPRECATED
- {
- return __rdf_sqlval_of_obj (o_col);
- }
- ;
- create function DB.DBA.RQ_BOOL_OF_O (in o_col any) returns any
- {
- declare t, len integer;
- if (isiri_id (o_col))
- return NULL;
- if (isinteger (o_col))
- {
- if (o_col)
- return 1;
- return 0;
- }
- if (__tag of rdf_box = __tag (o_col))
- {
- declare twobyte integer;
- declare dtqname any;
- if (__tag of varchar <> rdf_box_data_tag (o_col))
- {
- whenever sqlstate '*' goto retnull;
- return neq (rdf_box_data (o_col), 0.0);
- }
- twobyte := rdf_box_type (o_col);
- if (257 = twobyte)
- goto type_ok;
- whenever not found goto badtype;
- select RDT_QNAME into dtqname from DB.DBA.RDF_DATATYPE where RDT_TWOBYTE = twobyte;
- if (dtqname <> UNAME'http://www.w3.org/2001/XMLSchema#string')
- return null;
- type_ok:
- return case (length (rdf_box_data (o_col))) when 0 then 0 else 1 end;
- badtype:
- signal ('RDFXX', signal ('RDFXX', sprintf ('Unknown datatype in DB.DBA.RQ_BOOL_OF_O, bad type id %d, string value "%s"',
- twobyte, cast (rdf_box_data (o_col) as varchar) ) );
- }
- if (o_col is null)
- return null;
- whenever sqlstate '*' goto retnull;
- return neq (o_col, 0.0);
- retnull:
- return null;
- }
- ;
- create function DB.DBA.RQ_IID_OF_O (in shortobj any) returns IRI_ID -- DEPRECATED
- {
- return id_to_iri_nosignal (shortobj);
- }
- ;
- create function DB.DBA.RQ_O_IS_LIT (in shortobj any) returns integer -- DEPRECATED
- {
- if (isiri_id (shortobj))
- return 0;
- return 1;
- }
- ;
- -----
- -- Conversions from and to values in short representation that may be not field values (may perform more validation checks)
- create procedure RDF_G_INS (in id int, in g any)
- {
- geo_insert ('DB.DBA.RDF_GEO', g, id);
- }
- ;
- create procedure cl_rdf_geo_insert (in id int, inout g any)
- {
- declare daq any;
- daq := daq (1);
- daq_call (daq, 'DB.DBA.RDF_OBJ', 'RDF_OBJ', 'DB.DBA.RDF_G_INS', vector (id, g), 1);
- daq_results (daq);
- }
- ;
- create function rdf_geo_add (in v any)
- {
- declare id, h, ser, g any;
- if (rdf_box_ro_id (v))
- return v;
- g := rdf_box_data (v);
- if (not isgeometry (g))
- signal ('22023', 'RDFXX', 'Must be geometry box if to be stored as geo object');
- ser := serialize (g);
- if (length (ser) > 50)
- h := mdigest5 (ser);
- else
- {
- h := ser;
- ser := null;
- }
- set isolation = 'committed';
- id := (select ro_id, ro_val, ro_long from rdf_obj where ro_val = h and ro_dt_and_lang = 0hex1000101 and case when ro_long is not null then equ (blob_to_string (ro_long), ser) else 1 end );
- if (id is not null)
- {
- rdf_box_set_ro_id (v, id);
- return v;
- }
- set isolation = 'serializable';
- id := (select ro_id, ro_val, ro_long from rdf_obj where ro_val = h and ro_dt_and_lang = 0hex1000101 and case when ro_long is not null then equ (blob_to_string (ro_long), ser) else 1 end for update);
- if (id is not null)
- {
- rdf_box_set_ro_id (v, id);
- return v;
- }
- id := sequence_next ('RDF_RO_ID');
- set triggers off;
- -- dbg_obj_princ ('zero RO_FLAGS in sparql.sql:997 ', ro_val, ro_long);
- insert into rdf_obj (ro_id, ro_val, ro_long, ro_dt_and_lang)
- values (id, h, ser, 0hex1000101);
- if (1 = sys_stat ('cl_run_local_only'))
- geo_insert ('DB.DBA.RDF_GEO', g, id);
- else
- cl_rdf_geo_insert (id, g);
- rdf_box_set_ro_id (v, id);
- return v;
- }
- ;
- create function rdf_geo_set_id (inout v any)
- {
- declare id, h, ser, g any;
- if (rdf_box_ro_id (v))
- return v;
- g := rdf_box_data (v);
- if (not isgeometry (g))
- signal ('22023', 'RDFXX', 'Must be geometry box if to be stored as geo object');
- ser := serialize (g);
- if (length (ser) > 50)
- h := mdigest5 (ser);
- else
- {
- h := ser;
- ser := null;
- }
- set isolation = 'committed';
- id := (select RO_ID from RDF_OBJ where RO_VAL = h and RO_DT_AND_LANG = 0hex1000101
- and case when RO_LONG is not null then equ (blob_to_string (RO_LONG), ser) else 1 end );
- if (id is not null)
- {
- rdf_box_set_ro_id (v, id);
- return v;
- }
- return null;
- }
- ;
- create function DB.DBA.RDF_OBJ_ADD (in dt_twobyte integeR, in v varchar, in lang_twobyte integeR, in ro_id_dict any := 0) returns varchar
- {
- declare llong, id, need_digest integer;
- declare digest any;
- declare old_flags, dt_and_lang integer;
- -- dbg_obj_princ ('DB.DBA.RDF_OBJ_ADD (', dt_twobyte, v, lang_twobyte, case (isnull (ro_id_dict)) when 1 then '/*no_ft*/' else '/*want_ft*/' end,')');
- if (isinteger (ro_id_dict))
- {
- if (__rdf_obj_ft_rule_check (null, null))
- ro_id_dict := dict_new ();
- else
- ro_id_dict := null;
- }
- if (126 = __tag (v))
- v := blob_to_string (v);
- if (isstring (rdf_box_data (v)))
- need_digest := rdf_box_needs_digest (v, ro_id_dict);
- else if (__tag of XML = __tag (v))
- need_digest := 1;
- if (__tag of rdf_box = __tag (v))
- {
- if (256 = rdf_box_type (v))
- return rdf_geo_add (v);
- if (0 = need_digest)
- return v;
- if (1 = need_digest)
- {
- if (0 <> rdf_box_ro_id (v))
- return v;
- }
- dt_twobyte := rdf_box_type (v);
- lang_twobyte := rdf_box_lang (v);
- v := __rdf_sqlval_of_obj (v, 1);
- }
- else
- {
- if (dt_twobyte <> 257 or lang_twobyte <> 257)
- need_digest := 3;
- else if (0 = need_digest)
- return v;
- if (dt_twobyte < 257)
- signal ('RDFXX', sprintf ('Bad datatype code: DB.DBA.RDF_OBJ_ADD (%d, %s, %d)',
- dt_twobyte, "LEFT" (cast (v as varchar), 100), lang_twobyte) );
- if (lang_twobyte < 257)
- signal ('RDFXX', sprintf ('Bad lang code: DB.DBA.RDF_OBJ_ADD (%d, %s, %d)',
- dt_twobyte, "LEFT" (cast (v as varchar), 100), lang_twobyte) );
- }
- dt_and_lang := bit_or (bit_shift (dt_twobyte, 16), lang_twobyte);
- if (not isstring (v))
- {
- declare sum64 varchar;
- if (__tag of XML <> __tag (v))
- signal ('RDFXX', sprintf ('Bad call: DB.DBA.RDF_OBJ_ADD (%d, %s, %d)',
- dt_twobyte, "LEFT" (cast (v as varchar), 100), lang_twobyte) );
- sum64 := xtree_sum64 (v);
- whenever not found goto serializable_xtree;
- set isolation='committed';
- select RO_ID, RO_FLAGS into id, old_flags
- from DB.DBA.RDF_OBJ table option (index RO_VAL)
- where RO_VAL = sum64
- and RO_DT_AND_LANG = dt_and_lang
- and bit_and (RO_FLAGS, 2);
- --!TBD ... and paranoid check
- goto found_xtree;
- serializable_xtree:
- whenever not found goto new_xtree;
- set isolation='serializable';
- declare id_cr cursor for
- select RO_ID, RO_FLAGS from DB.DBA.RDF_OBJ table option (index RO_VAL) where RO_VAL = sum64
- and RO_DT_AND_LANG = dt_and_lang
- and bit_and (RO_FLAGS, 2);
- --!TBD ... and paranoid check
- open id_cr (exclusive);
- fetch id_cr into id, old_flags;
- found_xtree:
- digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
- if (ro_id_dict is not null)
- {
- if (not (bit_and (old_flags, 1)))
- {
- update DB.DBA.RDF_OBJ set RO_FLAGS = bit_or (RO_FLAGS, 1) where RO_ID = id;
- --insert soft rdf_ft (rf_id, rf_o) values (id, digest);
- }
- dict_put (ro_id_dict, id, 1);
- }
- if (not (rdf_box_is_storeable (digest)))
- signal ('RDFX2', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
- return digest;
- -- goto recheck;
- new_xtree:
- id := sequence_next ('RDF_RO_ID');
- digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
- -- if (ro_id_dict is null)
- -- {
- -- dbg_obj_princ ('zero RO_FLAGS in sparql.sql:1124');
- -- ;
- -- }
- insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_LONG, RO_FLAGS, RO_DT_AND_LANG) values
- (id, sum64, __xml_serialize_packed (v), case (isnull (ro_id_dict)) when 0 then 3 else 2 end, dt_and_lang);
- --if (ro_id_dict is not null)
- --insert soft rdf_ft (rf_id, rf_o) values (id, digest);
- if (ro_id_dict is not null)
- dict_put (ro_id_dict, id, 1);
- if (not (rdf_box_is_storeable (digest)))
- signal ('RDFX3', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
- return digest;
- -- old_digest := null;
- -- goto recheck;
- }
- if ((dt_twobyte = 257) and (lang_twobyte = 257) and (length (v) <= -1))
- {
- if (1 >= need_digest)
- return v;
- whenever not found goto serializable_veryshort;
- set isolation='committed';
- select RO_ID into id
- from DB.DBA.RDF_OBJ table option (index RO_VAL)
- where RO_VAL = v and RO_DT_AND_LANG = dt_and_lang and not (bit_and (RO_FLAGS, 2));
- goto found_veryshort;
- serializable_veryshort:
- whenever not found goto new_veryshort;
- set isolation='serializable';
- declare id_cr cursor for select RO_ID
- from DB.DBA.RDF_OBJ table option (index RO_VAL)
- where RO_VAL = v and RO_DT_AND_LANG = dt_and_lang and not (bit_and (RO_FLAGS, 2));
- open id_cr (exclusive);
- fetch id_cr into id;
- found_veryshort:
- if (ro_id_dict is not null)
- {
- dict_put (ro_id_dict, id, 1);
- --insert soft rdf_ft (rf_id, rf_o) values (id, v);
- }
- if (not (rdf_box_is_storeable (v)))
- signal ('RDFX4', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
- return v;
- new_veryshort:
- id := sequence_next ('RDF_RO_ID');
- insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_FLAGS, RO_DT_AND_LANG) values (id, v, 1, dt_and_lang);
- if (ro_id_dict is not null)
- {
- dict_put (ro_id_dict, id, 1);
- }
- insert into DB.DBA.RO_START (RS_START, RS_DT_AND_LANG, RS_RO_ID)
- values (subseq (v, 0, case when length (v) > 10 then 10 else length (v) end), dt_and_lang, rdf_box (0, 257, 257, id, 0));
- if (not (rdf_box_is_storeable (v)))
- signal ('RDFX5', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
- return v;
- }
- llong := 50;
- if (length (v) > llong)
- {
- declare chksm varchar;
- chksm := mdigest5 (v, 1);
- whenever not found goto serializable_long;
- set isolation='committed';
- select RO_ID, RO_FLAGS into id, old_flags
- from DB.DBA.RDF_OBJ table option (index RO_VAL)
- where RO_VAL = chksm
- and RO_DT_AND_LANG = dt_and_lang
- and not (bit_and (RO_FLAGS, 2))
- and blob_to_string (RO_LONG) = v;
- goto found_long;
- serializable_long:
- whenever not found goto new_long;
- set isolation='serializable';
- declare id_cr cursor for
- select RO_ID, RO_FLAGS from DB.DBA.RDF_OBJ
- table option (index RO_VAL) where RO_VAL = chksm
- and RO_DT_AND_LANG = dt_and_lang
- and not (bit_and (RO_FLAGS, 2))
- and blob_to_string (RO_LONG) = v;
- open id_cr (exclusive);
- fetch id_cr into id, old_flags;
- found_long:
- digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
- if ((not (bit_and (old_flags, 1))) and (1 < need_digest))
- update DB.DBA.RDF_OBJ set RO_FLAGS = bit_or (RO_FLAGS, 1) where RO_ID = id;
- if (ro_id_dict is not null)
- {
- dict_put (ro_id_dict, id, 1);
- }
- if (not (rdf_box_is_storeable (digest)))
- signal ('RDFX6', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
- return digest;
- new_long:
- id := sequence_next ('RDF_RO_ID');
- digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
- if (1 < need_digest)
- insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_LONG, RO_FLAGS, RO_DT_AND_LANG)
- values (id, chksm, v, 1, dt_and_lang);
- else
- {
- set triggers off;
- -- dbg_obj_princ ('zero RO_FLAGS in sparql.sql:1225 ', chksm, v);
- insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_LONG, RO_DT_AND_LANG)
- values (id, chksm, v, dt_and_lang);
- set triggers on;
- }
- if (ro_id_dict is not null)
- {
- dict_put (ro_id_dict, id, 1);
- }
- insert into DB.DBA.RO_START (RS_START, RS_DT_AND_LANG, RS_RO_ID)
- -- no need in values (subseq (v, 0, case when length (v) > 10 then 10 else length (v), RO_DT_AND_LANG, rdf_box (0, 257, 257, id, 0));
- values (subseq (v, 0, 10), dt_and_lang, rdf_box (0, 257, 257, id, 0));
- if (not (rdf_box_is_storeable (digest)))
- signal ('RDFX7', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
- return digest;
- }
- else
- {
- whenever not found goto serializable_short;
- set isolation='committed';
- select RO_ID, RO_FLAGS into id, old_flags
- from DB.DBA.RDF_OBJ table option (index RO_VAL)
- where RO_VAL = v
- and RO_DT_AND_LANG = dt_and_lang;
- goto found_short;
- serializable_short:
- whenever not found goto new_short;
- set isolation='serializable';
- declare id_cr cursor for select RO_ID, RO_FLAGS
- from DB.DBA.RDF_OBJ table option (index RO_VAL)
- where RO_VAL = v
- and RO_DT_AND_LANG = dt_and_lang;
- open id_cr (exclusive);
- fetch id_cr into id, old_flags;
- found_short:
- digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
- if ((not (bit_and (old_flags, 1))) and (1 < need_digest))
- update DB.DBA.RDF_OBJ set RO_FLAGS = bit_or (RO_FLAGS, 1) where RO_ID = id;
- if (ro_id_dict is not null)
- {
- dict_put (ro_id_dict, id, 1);
- }
- if (not (rdf_box_is_storeable (digest)))
- signal ('RDFX8', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
- return digest;
- new_short:
- id := sequence_next ('RDF_RO_ID');
- digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
- if (1 < need_digest)
- insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_FLAGS, RO_DT_AND_LANG)
- values (id, v, 1, dt_and_lang);
- else
- {
- -- dbg_obj_princ ('zero RO_FLAGS in sparql.sql:1271 ', v);
- set triggers off;
- insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_FLAGS, RO_DT_AND_LANG)
- values (id, v, 0, dt_and_lang);
- set triggers on;
- }
- insert into DB.DBA.RO_START (RS_START, RS_DT_AND_LANG, RS_RO_ID)
- values (subseq (v, 0, case when length (v) > 10 then 10 else length (v) end), dt_and_lang, rdf_box (0, 257, 257, id, 0));
- if (ro_id_dict is not null)
- {
- dict_put (ro_id_dict, id, 1);
- }
- if (not (rdf_box_is_storeable (digest)))
- signal ('RDFX9', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
- return digest;
- }
- recheck:
- -- dbg_obj_princ ('recheck: id=', id, ', old_digest=', old_digest, ', need_digest=', need_digest, ', digest=', digest);
- signal ('FUNNY', 'Debug code of DB.DBA.RDF_OBJ_ADD() is reached. This can not happen (I believe). Please report this error.');
- }
- ;
- create function DB.DBA.RDF_FIND_RO_DIGEST (in dt_twobyte integeR, in v varchar, in lang_twobyte integeR) returns varchar
- {
- declare llong, dt_and_lang int;
- declare dt_s, lang_s, chksm, sum64 varchar;
- declare digest, old_digest any;
- if (126 = __tag (v))
- v := blob_to_string (v);
- dt_and_lang := bit_or (bit_shift (dt_twobyte, 16), lang_twobyte);
- if (not (isstring (v)))
- {
- if (__tag of XML <> __tag (v))
- return v;
- sum64 := xtree_sum64 (v);
- return (select rdf_box (v, dt_twobyte, lang_twobyte, RO_ID, 1)
- from DB.DBA.RDF_OBJ table option (index RO_VAL)
- where RO_VAL = sum64
- and RO_DT_AND_LANG = dt_and_lang
- and bit_and (RO_FLAGS, 2)
- --!TBD ... and paranoid check
- );
- }
- if ((dt_twobyte = 257) and (lang_twobyte = 257) and (length (v) <= 20))
- return v;
- llong := 50;
- if (length (v) > llong)
- {
- chksm := mdigest5 (v, 1);
- return (select rdf_box (v, dt_twobyte, lang_twobyte, RO_ID, 1)
- from DB.DBA.RDF_OBJ table option (index RO_VAL)
- where RO_VAL = chksm
- and RO_DT_AND_LANG = dt_and_lang
- and not (bit_and (RO_FLAGS, 2))
- and blob_to_string (RO_LONG) = v );
- }
- else
- {
- return (select rdf_box (v, dt_twobyte, lang_twobyte, RO_ID, 1)
- from DB.DBA.RDF_OBJ table option (index RO_VAL)
- where RO_VAL = v
- and RO_DT_AND_LANG = dt_and_lang
- and not (bit_and (RO_FLAGS, 2)) );
- }
- }
- ;
- create function DB.DBA.RDF_MAKE_OBJ_OF_SQLVAL (in v any) returns any array
- {
- declare t int;
- t := __tag (v);
- if (not (t in (126, __tag of varchar, 217, __tag of nvarchar, __tag of XML, __tag of rdf_box)))
- return v;
- if (__tag of nvarchar = t)
- v := charset_recode (v, '_WIDE_', 'UTF-8');
- else if (t in (126, 217))
- v := cast (v as varchar);
- return DB.DBA.RDF_OBJ_ADD (257, v, 257);
- }
- ;
- create function DB.DBA.RDF_MAKE_OBJ_OF_SQLVAL_FT (in v any, in g_iid IRI_ID, in p_iid IRI_ID, in ro_id_dict any := null) returns any
- {
- declare t int;
- -- dbg_obj_princ ('DB.DBA.RDF_MAKE_OBJ_OF_SQLVAL_FT (', v, g_iid, p_iid, ro_id_dict, ')');
- t := __tag (v);
- if (not (t in (126, __tag of varchar, 217, __tag of nvarchar, __tag of XML, __tag of rdf_box)))
- return v;
- if (__tag of nvarchar = t)
- v := charset_recode (v, '_WIDE_', 'UTF-8');
- else if (t in (126, 217))
- v := cast (v as varchar);
- if (not __rdf_obj_ft_rule_check (g_iid, p_iid))
- ro_id_dict := null;
- else
- {
- if (ro_id_dict is null)
- {
- declare res any;
- ro_id_dict := dict_new ();
- res := DB.DBA.RDF_OBJ_ADD (257, v, 257, ro_id_dict);
- DB.DBA.RDF_OBJ_ADD_KEYWORD_FOR_GRAPH (g_iid, ro_id_dict);
- return res;
- }
- }
- return DB.DBA.RDF_OBJ_ADD (257, v, 257, ro_id_dict);
- }
- ;
- create function DB.DBA.RDF_MAKE_OBJ_OF_TYPEDSQLVAL (in v any, in dt_iid IRI_ID, in lang varchar) returns any array
- {
- declare t, dt_twobyte, lang_twobyte int;
- -- dbg_obj_princ ('DB.DBA.RDF_MAKE_OBJ_OF_TYPEDSQLVAL (', v, dt_iid, lang, ')');
- retry_unrdf:
- t := __tag (v);
- if (not (t in (126, __…