Changeset: 2c1e4c22a3ea for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2c1e4c22a3ea
Modified Files:
        monetdb5/extras/rdf/rdf.h
        monetdb5/extras/rdf/rdf_shredder.c
        monetdb5/extras/rdf/rdfschema.c
        monetdb5/extras/rdf/rdfschema.h
Branch: rdf
Log Message:

Encode the information about BLANK_NODE into object oid. (Change rdf_shredder)

Compute the number of references to blank nodes in each CS relationship


diffs (297 lines):

diff --git a/monetdb5/extras/rdf/rdf.h b/monetdb5/extras/rdf/rdf.h
--- a/monetdb5/extras/rdf/rdf.h
+++ b/monetdb5/extras/rdf/rdf.h
@@ -53,13 +53,14 @@ RDFleftfetchjoin_sorted(int *result, int
 rdf_export str 
 TKNZRrdf2str (bat *res, bat *bid, bat *map);
 
-#define RDF_MIN_LITERAL (((oid) 1) << ((sizeof(oid)==8)?60:28))
+#define RDF_MIN_LITERAL (((oid) 1) << ((sizeof(oid)==8)?59:27))
 
 typedef enum {
-       URI,
+       URI,            
        DATETIME, 
        NUMERIC, 
-       STRING
+       STRING,
+       BLANKNODE       
 } ObjectType; 
 
 #define IS_DUPLICATE_FREE 0            /* 0: Duplications have not been 
removed, otherwise 1 */
diff --git a/monetdb5/extras/rdf/rdf_shredder.c 
b/monetdb5/extras/rdf/rdf_shredder.c
--- a/monetdb5/extras/rdf/rdf_shredder.c
+++ b/monetdb5/extras/rdf/rdf_shredder.c
@@ -211,6 +211,19 @@ rdf_BUNappend(parserData* pdata, BAT *b,
 
 }
 
+
+static void
+rdf_BUNappend_BlankNode_Obj(parserData* pdata, BAT *b, BUN* bun){
+       *bun |= (BUN)4 << (sizeof(BUN)*8 - 4);          //Blank node    
+       b = BUNappend(b, bun, TRUE);
+       if (b == NULL) {
+               pdata->exception++;
+               pdata->exceptionMsg =  "could not append to a BAT with 
rdf_BUNappend_BlankNode_Obj";
+               raptor_parser_parse_abort (pdata->rparser);
+       }
+
+}
+
 /* For inserting an literal object value of RDF triple */
 
 static void 
@@ -227,13 +240,13 @@ rdf_BUNappend_unq_ForObj(parserData* pda
        
                /* Add the type here by changing 2 bits at position 62, 63 of 
oid */
                if ( objType == DATETIME){ 
-                       *bun |= (BUN)1 << (sizeof(BUN)*8 - 3);
+                       *bun |= (BUN)1 << (sizeof(BUN)*8 - 4);
                }
                else if ( objType == NUMERIC){
-                       *bun |= (BUN)2 << (sizeof(BUN)*8 - 3);
+                       *bun |= (BUN)2 << (sizeof(BUN)*8 - 4);
                }
                else { /*  objType == STRING */
-                       *bun |= (BUN)3 << (sizeof(BUN)*8 - 3);
+                       *bun |= (BUN)3 << (sizeof(BUN)*8 - 4);
                }
 
                //b = BUNappend(b, (ptr) (str)objStr, TRUE);
@@ -336,8 +349,7 @@ tripleHandler(void* user_data, const rap
                        raptor_exception(pdata, "could not determine type of 
property");
                }
 
-               if (triple->object->type == RAPTOR_TERM_TYPE_URI
-                               || triple->object->type == 
RAPTOR_TERM_TYPE_BLANK) {
+               if (triple->object->type == RAPTOR_TERM_TYPE_URI) {
                        unsigned char* objStr;
                        objStr = raptor_term_to_string(triple->object);
                        //rdf_insert(pdata, graph[MAP_LEX], (str) objStr, &bun);
@@ -346,6 +358,16 @@ tripleHandler(void* user_data, const rap
 
                        bun = BUN_NONE;
                        free(objStr);
+               } else if (triple->object->type == RAPTOR_TERM_TYPE_BLANK) {
+                       unsigned char* objStr;
+                       objStr = raptor_term_to_string(triple->object);
+                       rdf_tknzr_insert((str) objStr, &bun);
+                       rdf_BUNappend_BlankNode_Obj(pdata, graph[O_sort], 
&bun); 
+                       //rdf_BUNappend(pdata, graph[O_sort], &bun); 
+
+                       bun = BUN_NONE;
+                       free(objStr);
+               
                } else if (triple->object->type == RAPTOR_TERM_TYPE_LITERAL) {
                        unsigned char* objStr;
                        ObjectType objType;
diff --git a/monetdb5/extras/rdf/rdfschema.c b/monetdb5/extras/rdf/rdfschema.c
--- a/monetdb5/extras/rdf/rdfschema.c
+++ b/monetdb5/extras/rdf/rdfschema.c
@@ -131,6 +131,7 @@ CSrel* creataCSrel(oid csoid){
        csrel->lstRefCSoid = (oid*) malloc(sizeof(oid) * INIT_NUM_CSREL);
        csrel->lstPropId = (oid*) malloc(sizeof(oid) * INIT_NUM_CSREL);
        csrel->lstCnt = (int*) malloc(sizeof(int) * INIT_NUM_CSREL);            
+       csrel->lstBlankCnt = (int*) malloc(sizeof(int) * INIT_NUM_CSREL);       
        
        csrel->numRef = 0;
        csrel->numAllocation = INIT_NUM_CSREL;
 
@@ -139,11 +140,12 @@ CSrel* creataCSrel(oid csoid){
 
 
 static 
-void addReltoCSRel(oid origCSoid, oid refCSoid, oid propId, CSrel *csrel)
+void addReltoCSRel(oid origCSoid, oid refCSoid, oid propId, CSrel *csrel, char 
isBlankNode)
 {
        void *_tmp; 
        void *_tmp1; 
-       void *_tmp2; 
+       void *_tmp2;
+       void *_tmp3; 
 
        int i = 0; 
 
@@ -163,6 +165,7 @@ void addReltoCSRel(oid origCSoid, oid re
        
        if (i != csrel->numRef){ 
                csrel->lstCnt[i]++; 
+               csrel->lstBlankCnt[i] += (int) isBlankNode; 
                return; 
        }
        else{   // New Ref
@@ -174,29 +177,33 @@ void addReltoCSRel(oid origCSoid, oid re
                        _tmp = realloc(csrel->lstRefCSoid, 
(csrel->numAllocation * sizeof(oid)));
                        _tmp1 = realloc(csrel->lstPropId, (csrel->numAllocation 
* sizeof(oid)));
                        _tmp2 = realloc(csrel->lstCnt, (csrel->numAllocation * 
sizeof(int)));
+                       _tmp3 = realloc(csrel->lstBlankCnt, 
(csrel->numAllocation * sizeof(int)));
 
-                       if (!_tmp || !_tmp2){
+                       if (!_tmp || !_tmp2 || !_tmp3){
                                fprintf(stderr, "ERROR: Couldn't realloc 
memory!\n");
                        }
                        csrel->lstRefCSoid = (oid*)_tmp;
                        csrel->lstPropId = (oid*)_tmp1; 
                        csrel->lstCnt = (int*)_tmp2; 
+                       csrel->lstBlankCnt = (int*)_tmp3; 
                }
 
                csrel->lstRefCSoid[csrel->numRef] = refCSoid;
                csrel->lstPropId[csrel->numRef] = propId;
                csrel->lstCnt[csrel->numRef] = 1; 
+               csrel->lstBlankCnt[csrel->numRef] = (int) isBlankNode; 
                csrel->numRef++;
        }
 }
 
 
 static 
-void addReltoCSRelWithFreq(oid origCSoid, oid refCSoid, oid propId, int freq, 
CSrel *csrel)
+void addReltoCSRelWithFreq(oid origCSoid, oid refCSoid, oid propId, int freq, 
int numBlank, CSrel *csrel)
 {
        void *_tmp; 
        void *_tmp1; 
        void *_tmp2; 
+       void *_tmp3; 
 
        int i = 0; 
 
@@ -216,6 +223,7 @@ void addReltoCSRelWithFreq(oid origCSoid
        
        if (i != csrel->numRef){ 
                csrel->lstCnt[i] = csrel->lstCnt[i] + freq; 
+               csrel->lstBlankCnt[i] = csrel->lstBlankCnt[i] + numBlank; 
                return; 
        }
        else{   // New Ref
@@ -227,18 +235,21 @@ void addReltoCSRelWithFreq(oid origCSoid
                        _tmp = realloc(csrel->lstRefCSoid, 
(csrel->numAllocation * sizeof(oid)));
                        _tmp1 = realloc(csrel->lstPropId, (csrel->numAllocation 
* sizeof(oid)));                
                        _tmp2 = realloc(csrel->lstCnt, (csrel->numAllocation * 
sizeof(int)));
+                       _tmp3 = realloc(csrel->lstBlankCnt, 
(csrel->numAllocation * sizeof(int)));
 
-                       if (!_tmp || !_tmp2){
+                       if (!_tmp || !_tmp2 || !_tmp3){
                                fprintf(stderr, "ERROR: Couldn't realloc 
memory!\n");
                        }
                        csrel->lstRefCSoid = (oid*)_tmp;
                        csrel->lstPropId = (oid*)_tmp1; 
                        csrel->lstCnt = (int*)_tmp2; 
+                       csrel->lstBlankCnt = (int*)_tmp3; 
                }
 
                csrel->lstRefCSoid[csrel->numRef] = refCSoid;
                csrel->lstPropId[csrel->numRef] = propId;
                csrel->lstCnt[csrel->numRef] = freq; 
+               csrel->lstBlankCnt[csrel->numRef] = numBlank; 
                csrel->numRef++;
        }
 }
@@ -352,7 +363,7 @@ str printCSrelWithMaxSet(oid* csSuperCSM
                if (csrelSet[i].numRef != 0){
                        for (j = 0; j < csrelSet[i].numRef; j++){               
                                if (csSuperCSMap[csrelSet[i].lstRefCSoid[j]] != 
BUN_NONE){
-                                       
addReltoCSRelWithFreq(csrelSet[i].origCSoid, 
csSuperCSMap[csrelSet[i].lstRefCSoid[j]], csrelSet[i].lstPropId[j], 
csrelSet[i].lstCnt[j], &csrelToMaxSet[i]);
+                                       
addReltoCSRelWithFreq(csrelSet[i].origCSoid, 
csSuperCSMap[csrelSet[i].lstRefCSoid[j]], csrelSet[i].lstPropId[j], 
csrelSet[i].lstCnt[j], csrelSet[i].lstBlankCnt[j], &csrelToMaxSet[i]);
                                }
                        }
 
@@ -363,10 +374,10 @@ str printCSrelWithMaxSet(oid* csSuperCSM
                        if (maxCSoid != BUN_NONE){
                                for (j = 0; j < csrelSet[i].numRef; j++){       
        
                                        if 
(csSuperCSMap[csrelSet[i].lstRefCSoid[j]] != BUN_NONE){
-                                               addReltoCSRelWithFreq(maxCSoid, 
csSuperCSMap[csrelSet[i].lstRefCSoid[j]], csrelSet[i].lstPropId[j], 
csrelSet[i].lstCnt[j], &csrelFromMaxSet[maxCSoid]);
+                                               addReltoCSRelWithFreq(maxCSoid, 
csSuperCSMap[csrelSet[i].lstRefCSoid[j]], csrelSet[i].lstPropId[j], 
csrelSet[i].lstCnt[j],csrelSet[i].lstBlankCnt[j], &csrelFromMaxSet[maxCSoid]);
                                        }
                                        else{
-                                               addReltoCSRelWithFreq(maxCSoid, 
csrelSet[i].lstRefCSoid[j], csrelSet[i].lstPropId[j], csrelSet[i].lstCnt[j], 
&csrelFromMaxSet[maxCSoid]);
+                                               addReltoCSRelWithFreq(maxCSoid, 
csrelSet[i].lstRefCSoid[j], csrelSet[i].lstPropId[j], csrelSet[i].lstCnt[j], 
csrelSet[i].lstBlankCnt[j], &csrelFromMaxSet[maxCSoid]);
                                        }
                                }
                        }
@@ -448,7 +459,7 @@ str printCSrelWithMaxSet(oid* csSuperCSM
                if (csrelToMaxSet[i].numRef != 0 && maxCSoid != BUN_NONE){
                        for (j = 0; j < csrelToMaxSet[i].numRef; j++){          
                                
assert(csSuperCSMap[csrelToMaxSet[i].lstRefCSoid[j]] == 
csrelToMaxSet[i].lstRefCSoid[j]);
-                               addReltoCSRelWithFreq(maxCSoid, 
csSuperCSMap[csrelToMaxSet[i].lstRefCSoid[j]], csrelToMaxSet[i].lstPropId[j], 
csrelToMaxSet[i].lstCnt[j], &csrelBetweenMaxSet[maxCSoid]);
+                               addReltoCSRelWithFreq(maxCSoid, 
csSuperCSMap[csrelToMaxSet[i].lstRefCSoid[j]], csrelToMaxSet[i].lstPropId[j], 
csrelToMaxSet[i].lstCnt[j],csrelToMaxSet[i].lstBlankCnt[j], 
&csrelBetweenMaxSet[maxCSoid]);
                        }
                }
        }
@@ -464,13 +475,13 @@ str printCSrelWithMaxSet(oid* csSuperCSM
                        for (j = 0; j < csrelBetweenMaxSet[i].numRef; j++){
                                #if SHOWPROPERTYNAME
                                takeOid(csrelBetweenMaxSet[i].lstPropId[j], 
&propStr);  
-                               fprintf(fout2, BUNFMT "(P:" BUNFMT " - %s) (%d) 
", csrelBetweenMaxSet[i].lstRefCSoid[j],csrelBetweenMaxSet[i].lstPropId[j], 
propStr, csrelBetweenMaxSet[i].lstCnt[j]);  
+                               fprintf(fout2, BUNFMT "(P:" BUNFMT " - %s) 
(%d)(Blank:%d) ", 
csrelBetweenMaxSet[i].lstRefCSoid[j],csrelBetweenMaxSet[i].lstPropId[j], 
propStr, csrelBetweenMaxSet[i].lstCnt[j], 
csrelBetweenMaxSet[i].lstBlankCnt[j]);  
                                #else
-                               fprintf(fout2, BUNFMT "(P:" BUNFMT ") (%d) ", 
csrelBetweenMaxSet[i].lstRefCSoid[j],csrelBetweenMaxSet[i].lstPropId[j], 
csrelBetweenMaxSet[i].lstCnt[j]);        
+                               fprintf(fout2, BUNFMT "(P:" BUNFMT ") 
(%d)(Blank:%d) ", 
csrelBetweenMaxSet[i].lstRefCSoid[j],csrelBetweenMaxSet[i].lstPropId[j], 
csrelBetweenMaxSet[i].lstCnt[j], csrelBetweenMaxSet[i].lstBlankCnt[j]);        
                                #endif
 
                                if (*freq < 
csrelBetweenMaxSet[i].lstCnt[j]*100){
-                                       fprintf(fout2filter, BUNFMT "(P:" 
BUNFMT ") (%d) ", 
csrelBetweenMaxSet[i].lstRefCSoid[j],csrelBetweenMaxSet[i].lstPropId[j], 
csrelBetweenMaxSet[i].lstCnt[j]);  
+                                       fprintf(fout2filter, BUNFMT "(P:" 
BUNFMT ") (%d)(Blank:%d) ", 
csrelBetweenMaxSet[i].lstRefCSoid[j],csrelBetweenMaxSet[i].lstPropId[j], 
csrelBetweenMaxSet[i].lstCnt[j], csrelBetweenMaxSet[i].lstBlankCnt[j]);  
                                }
                        }       
                        fprintf(fout2, "\n");
@@ -843,9 +854,10 @@ str printFreqCSSet(CSset *freqCSset, oid
                                // Get object value
                                objOid = cs.lstObj[j]; 
 
-                               objType = (char) (objOid >> (sizeof(BUN)*8 - 
3))  &  3 ; 
+                               objType = (char) (objOid >> (sizeof(BUN)*8 - 
4))  &  7 ; 
 
-                               if (objType == URI){
+                               if (objType == URI || objType == BLANKNODE){
+                                       objOid = objOid - ((oid)objType << 
(sizeof(BUN)*8 - 4));
                                        takeOid(objOid, &objStr); 
                                }
                                else{
@@ -1676,6 +1688,8 @@ str RDFrelationships(int *ret, BAT *sbat
        char            objType;
        oid             returnSubCSid; 
        char*           buffTypes; 
+       oid             realObjOid;     
+       char            isBlankNode; 
 
        if (BATcount(sbat) == 0) {
                throw(RDF, "rdf.RDFrelationships", "sbat must not be empty");
@@ -1703,17 +1717,21 @@ str RDFrelationships(int *ret, BAT *sbat
                                
                obt = (oid *) BUNtloc(oi, p); 
                /* Check type of object */
-               objType = (char) ((*obt) >> (sizeof(BUN)*8 - 3))  &  3 ;        
/* Get two bits 63th, 62nd from object oid */
+               objType = (char) ((*obt) >> (sizeof(BUN)*8 - 4))  &  7 ;        
/* Get two bits 63th, 62nd from object oid */
 
                buffTypes[numPwithDup] = objType; 
                numPwithDup++; 
                
-               /* Look at sbat*/
-               if (objType == URI){
+               /* Look at the referenced CS Id using subjCSMap */
+               isBlankNode = 0;
+               if (objType == URI || objType == BLANKNODE){
                        pbt = (oid *) BUNtloc(pi, p); 
-                       if (*obt <= maxSoid && subjCSMap[*obt] != BUN_NONE){
+                       realObjOid = (*obt) - ((oid) objType << (sizeof(BUN)*8 
- 4));
+
+                       if (realObjOid <= maxSoid && subjCSMap[realObjOid] != 
BUN_NONE){
+                               if (objType == BLANKNODE) isBlankNode = 1;
                                ////printf(" Subject " BUNFMT " refer to CS " 
BUNFMT " \n",*sbt, subjCSMap[*obt]);
-                               addReltoCSRel(subjCSMap[*sbt], subjCSMap[*obt], 
*pbt, &csrelSet[subjCSMap[*sbt]]);
+                               addReltoCSRel(subjCSMap[*sbt], 
subjCSMap[realObjOid], *pbt, &csrelSet[subjCSMap[*sbt]], isBlankNode);
                        }
                }
        }
diff --git a/monetdb5/extras/rdf/rdfschema.h b/monetdb5/extras/rdf/rdfschema.h
--- a/monetdb5/extras/rdf/rdfschema.h
+++ b/monetdb5/extras/rdf/rdfschema.h
@@ -103,6 +103,7 @@ typedef struct CSrel{
        oid* lstRefCSoid;               
        oid* lstPropId;         // Predicate for a relationship
        int* lstCnt;            // Count per reference
+       int* lstBlankCnt;       // Count # links to blank node
        int  numRef; 
        int  numAllocation; 
 } CSrel;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to