Changeset: 331d6461d586 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=331d6461d586
Modified Files:
monetdb5/extras/rdf/rdf.h
monetdb5/extras/rdf/rdfalgebra.c
monetdb5/extras/rdf/rdfalgebra.mal
monetdb5/extras/rdf/rdfschema.c
monetdb5/extras/rdf/rdfschema.h
monetdb5/extras/rdf/rdfschema.mal
Branch: rdf
Log Message:
Add a function for outter joining the an input bat and a mapping bat, but for
non-matching value use the original value from input bat instead of nil value.
diffs (truncated from 371 to 300 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,6 +53,11 @@ RDFleftfetchjoin_sorted(int *result, int
rdf_export str
TKNZRrdf2str (bat *res, bat *bid, bat *map);
+rdf_export str
+RDFpartialjoin (bat *res, bat *lmap, bat *rmap, bat *input);
+
+
+
#define RDF_MIN_LITERAL (((oid) 1) << ((sizeof(oid)==8)?59:27))
typedef enum {
diff --git a/monetdb5/extras/rdf/rdfalgebra.c b/monetdb5/extras/rdf/rdfalgebra.c
--- a/monetdb5/extras/rdf/rdfalgebra.c
+++ b/monetdb5/extras/rdf/rdfalgebra.c
@@ -54,6 +54,62 @@ RDFleftfetchjoin_sorted(bat *result, bat
str
+RDFpartialjoin(bat *retid, bat *lid, bat *rid, bat *inputid){
+ BAT *left, *right, *result, *map, *input;
+ BATiter resulti,inputi;
+ BUN p,q;
+ oid *rbt;
+ oid *ibt;
+
+
+ if ((left = BATdescriptor(*lid)) == NULL) {
+ throw(MAL, "rdf.RDFpartialjoin", RUNTIME_OBJECT_MISSING);
+ }
+ if ((right = BATdescriptor(*rid)) == NULL) {
+ BBPreleaseref(left->batCacheid);
+ throw(MAL, "rdf.RDFpartialjoin", RUNTIME_OBJECT_MISSING);
+ }
+
+ if ((input = BATdescriptor(*inputid)) == NULL) {
+ BBPreleaseref(left->batCacheid);
+ BBPreleaseref(right->batCacheid);
+ throw(MAL, "rdf.RDFpartialjoin", RUNTIME_OBJECT_MISSING);
+ }
+ //result = BATouterjoin(left, right, BUN_NONE);
+ map = BATleftfetchjoin(BATmirror(left), right, BUN_NONE);
+
+ BBPreleaseref(left->batCacheid);
+ BBPreleaseref(right->batCacheid);
+
+ //BATprint(map);
+
+ result = BATouterjoin(input, map, BUN_NONE);
+
+ resulti = bat_iterator(result);
+ inputi = bat_iterator(input);
+
+ BATloop(result, p, q){
+ rbt = (oid *) BUNtloc(resulti, p);
+ if (*rbt == oid_nil){
+ ibt = (oid *) BUNtloc(inputi, p);
+ *rbt = *ibt;
+ }
+ }
+
+ BBPreleaseref(input->batCacheid);
+
+ //BATprint(result);
+ if (result == NULL)
+ throw(MAL, "rdf.RDFpartialjoin", GDK_EXCEPTION);
+
+ *retid = result->batCacheid;
+ BBPkeepref(*retid);
+
+ return MAL_SUCCEED;
+}
+
+
+str
TKNZRrdf2str(bat *res, bat *bid, bat *map)
{
BAT *r, *b, *m;
diff --git a/monetdb5/extras/rdf/rdfalgebra.mal
b/monetdb5/extras/rdf/rdfalgebra.mal
--- a/monetdb5/extras/rdf/rdfalgebra.mal
+++ b/monetdb5/extras/rdf/rdfalgebra.mal
@@ -24,3 +24,8 @@ comment "like algebra_leftfetchjoin(), b
command rdf2str(i:bat[:oid,:oid],map:bat[:oid,:str]):bat[:oid,:str]
address TKNZRrdf2str
comment "converts id's into strings using the dictionary, but if (id >=
RDF_MIN_LITERAL) look it up in a literal map bat";
+
+command partialjoin(lmap:bat[:oid, :any_1], rmap:bat[:oid, :any_2],
input:bat[:oid,:any_1]):bat[:any_1,:any_2]
+address RDFpartialjoin
+comment "Join the input bat and the map bat (lmap, rmap). However, do not use
nil for non-matching value but use the original value from input bat"
+
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
@@ -2619,17 +2619,14 @@ void printCSmergeRel(CSset *freqCSset, C
/* Extract CS from SPO triples table */
str
-RDFextractCSwithTypes(int *ret, bat *sbatid, bat *pbatid, bat *obatid, bat
*mapbatid, int *freqThreshold){
+RDFextractCSwithTypes(int *ret, bat *sbatid, bat *pbatid, bat *obatid, bat
*mapbatid, int *freqThreshold, void *_freqCSset, oid **subjCSMap, oid
*maxCSoid){
BAT *sbat = NULL, *pbat = NULL, *obat = NULL, *mbat = NULL;
BATiter si, pi, oi; /*iterator for BAT of s,p,o columns in
spo table */
- CSset *freqCSset; /* Set of frequent CSs */
CSBats *csBats;
- oid *subjCSMap; /* Store the corresponding CS Id for
each subject */
oid *subjSubCSMap; /* Store the corresponding CS sub Id
for each subject */
BUN *maxSoid;
- oid maxCSoid = 0;
int maxNumProp = 0;
int maxNumPwithDup = 0;
char *csFreqMap;
@@ -2644,7 +2641,7 @@ RDFextractCSwithTypes(int *ret, bat *sba
int numMaxCSs = 0;
oid *superCSFreqCSMap;
oid *superCSMergeMaxCSMap;
-
+ CSset *freqCSset;
if ((sbat = BATdescriptor(*sbatid)) == NULL) {
throw(MAL, "rdf.RDFextractCSwithTypes", RUNTIME_OBJECT_MISSING);
@@ -2676,52 +2673,53 @@ RDFextractCSwithTypes(int *ret, bat *sba
csBats = initCSBats();
- freqCSset = initCSset();
+ freqCSset = ((CSset *) _freqCSset);
+
maxSoid = (BUN *) Tloc(sbat, BUNlast(sbat) - 1);
printf("Max S oid: " BUNFMT "\n", *maxSoid);
assert(*maxSoid != BUN_NONE);
- subjCSMap = (oid *) malloc (sizeof(oid) * ((*maxSoid) + 1));
+ *subjCSMap = (oid *) malloc (sizeof(oid) * ((*maxSoid) + 1));
subjSubCSMap = (oid *) malloc (sizeof(oid) * ((*maxSoid) + 1));
- initArray(subjCSMap, (*maxSoid) + 1, BUN_NONE);
+ initArray(*subjCSMap, (*maxSoid) + 1, BUN_NONE);
//Phase 1: Assign an ID for each CS
#if STOREFULLCS
- RDFassignCSId(ret, sbat, si, pi, oi, freqCSset, freqThreshold, csBats,
subjCSMap, &maxCSoid, &maxNumProp, &maxNumPwithDup);
+ RDFassignCSId(ret, sbat, si, pi, oi, freqCSset, freqThreshold, csBats,
*subjCSMap, maxCSoid, &maxNumProp, &maxNumPwithDup);
#else
- RDFassignCSId(ret, sbat, si, pi, freqCSset, freqThreshold, csBats,
subjCSMap, &maxCSoid, &maxNumProp, &maxNumPwithDup);
+ RDFassignCSId(ret, sbat, si, pi, freqCSset, freqThreshold, csBats,
*subjCSMap, maxCSoid, &maxNumProp, &maxNumPwithDup);
#endif
//Phase 2: Check the relationship
- printf("Max CS oid: " BUNFMT "\n", maxCSoid);
+ printf("Max CS oid: " BUNFMT "\n", *maxCSoid);
printf("Max Number of P (considering duplicated P): %d \n",
maxNumPwithDup);
- csFreqMap = (char*) malloc(sizeof(char) * (maxCSoid +1));
- initCharArray(csFreqMap, maxCSoid +1, 0);
+ csFreqMap = (char*) malloc(sizeof(char) * (*maxCSoid +1));
+ initCharArray(csFreqMap, *maxCSoid +1, 0);
generateFreqCSMap(freqCSset,csFreqMap);
- csrelSet = initCSrelset(maxCSoid + 1);
-
-
- csSubCSMap = initCS_SubCSMap(maxCSoid +1);
-
- RDFrelationships(ret, sbat, si, pi, oi, subjCSMap, subjSubCSMap,
csSubCSMap, csrelSet, *maxSoid, maxNumPwithDup);
-
-
- printCSrelSet(csrelSet,csFreqMap, csBats->freqBat, maxCSoid + 1, 1,
*freqThreshold);
-
- printSubCSInformation(csSubCSMap, csBats->freqBat, maxCSoid + 1, 1,
*freqThreshold);
+ csrelSet = initCSrelset(*maxCSoid + 1);
+
+
+ csSubCSMap = initCS_SubCSMap(*maxCSoid +1);
+
+ RDFrelationships(ret, sbat, si, pi, oi, *subjCSMap, subjSubCSMap,
csSubCSMap, csrelSet, *maxSoid, maxNumPwithDup);
+
+
+ printCSrelSet(csrelSet,csFreqMap, csBats->freqBat, *maxCSoid + 1, 1,
*freqThreshold);
+
+ printSubCSInformation(csSubCSMap, csBats->freqBat, *maxCSoid + 1, 1,
*freqThreshold);
printf("Number of frequent CSs is: %d \n", freqCSset->numCSadded);
@@ -2729,33 +2727,33 @@ RDFextractCSwithTypes(int *ret, bat *sba
//getTopFreqCSs(csMap,*freqThreshold);
- getMaximumFreqCSs(freqCSset, csBats->coverageBat, csBats->freqBat,
maxCSoid + 1, &numMaxCSs);
+ getMaximumFreqCSs(freqCSset, csBats->coverageBat, csBats->freqBat,
*maxCSoid + 1, &numMaxCSs);
//printf("Number of maximumCS: %d", numMaxCSs);
printFreqCSSet(freqCSset, csBats->freqBat, mbat, 1, *freqThreshold);
- csrelToMaxFreqSet = initCSrelset(maxCSoid + 1); // CS --> Reference
MaxCSs
- csrelFromMaxFreqSet = initCSrelset(maxCSoid + 1); // CS -->
Reference MaxCSs
- csrelBetweenMaxFreqSet = initCSrelset(maxCSoid + 1); // MaxCS -->
Reference MaxCSs
-
-
- csIdFreqIdxMap = (int *) malloc (sizeof(int) * (maxCSoid + 1));
- initcsIdFreqIdxMap(csIdFreqIdxMap, maxCSoid + 1, -1, freqCSset);
-
- printCSrelWithMaxSet(freqCSset, csIdFreqIdxMap, csrelToMaxFreqSet,
csrelFromMaxFreqSet, csrelBetweenMaxFreqSet, csrelSet,csFreqMap,
csBats->freqBat, maxCSoid + 1, *freqThreshold);
+ csrelToMaxFreqSet = initCSrelset(*maxCSoid + 1); // CS -->
Reference MaxCSs
+ csrelFromMaxFreqSet = initCSrelset(*maxCSoid + 1); // CS -->
Reference MaxCSs
+ csrelBetweenMaxFreqSet = initCSrelset(*maxCSoid + 1); // MaxCS -->
Reference MaxCSs
+
+
+ csIdFreqIdxMap = (int *) malloc (sizeof(int) * (*maxCSoid + 1));
+ initcsIdFreqIdxMap(csIdFreqIdxMap, *maxCSoid + 1, -1, freqCSset);
+
+ printCSrelWithMaxSet(freqCSset, csIdFreqIdxMap, csrelToMaxFreqSet,
csrelFromMaxFreqSet, csrelBetweenMaxFreqSet, csrelSet,csFreqMap,
csBats->freqBat, *maxCSoid + 1, *freqThreshold);
superCSFreqCSMap = (oid*) malloc(sizeof(oid) * numMaxCSs);
superCSMergeMaxCSMap = (oid*) malloc(sizeof(oid) * numMaxCSs);
//mergeMaximumFreqCSs(freqCSset, superCSFreqCSMap,
superCSMergeMaxCSMap, mergecsSet, numMaxCSs);
- mergeMaximumFreqCSsAll(freqCSset, superCSFreqCSMap,
superCSMergeMaxCSMap, numMaxCSs, maxCSoid);
+ mergeMaximumFreqCSsAll(freqCSset, superCSFreqCSMap,
superCSMergeMaxCSMap, numMaxCSs, *maxCSoid);
csRelBetweenMergeFreqSet = (CSmergeRel *) malloc (sizeof(CSmergeRel) *
freqCSset->numCSadded);
initCsRelBetweenMergeFreqSet(csRelBetweenMergeFreqSet,
freqCSset->numCSadded);
- generateCsRelBetweenMergeFreqSet(csRelBetweenMergeFreqSet,
csrelBetweenMaxFreqSet, maxCSoid + 1, csIdFreqIdxMap, freqCSset);
+ generateCsRelBetweenMergeFreqSet(csRelBetweenMergeFreqSet,
csrelBetweenMaxFreqSet, *maxCSoid + 1, csIdFreqIdxMap, freqCSset);
printCSmergeRel(freqCSset, csRelBetweenMergeFreqSet, *freqThreshold);
printmergeCSSet(freqCSset, *freqThreshold);
@@ -2769,23 +2767,21 @@ RDFextractCSwithTypes(int *ret, bat *sba
BBPreclaim(obat);
BBPreclaim(mbat);
- free (subjCSMap);
free (subjSubCSMap);
free (csFreqMap);
free (superCSFreqCSMap);
free (superCSMergeMaxCSMap);
- freeCS_SubCSMapSet(csSubCSMap, maxCSoid + 1);
+ freeCS_SubCSMapSet(csSubCSMap, *maxCSoid + 1);
free(csIdFreqIdxMap);
free(csRelBetweenMergeFreqSet);
- freeCSrelSet(csrelSet, maxCSoid + 1);
- freeCSrelSet(csrelToMaxFreqSet, maxCSoid + 1);
- freeCSrelSet(csrelBetweenMaxFreqSet, maxCSoid + 1);
+ freeCSrelSet(csrelSet, *maxCSoid + 1);
+ freeCSrelSet(csrelToMaxFreqSet, *maxCSoid + 1);
+ freeCSrelSet(csrelBetweenMaxFreqSet, *maxCSoid + 1);
freeCSBats(csBats);
- freeCSset(freqCSset);
//testBatHash();
@@ -2868,3 +2864,65 @@ RDFextractPfromPSO(int *ret, bat *pbatid
return MAL_SUCCEED;
}
+
+
+str
+RDFreorganize(int *ret, bat *sbatid, bat *pbatid, bat *obatid, bat *mapbatid,
int *freqThreshold){
+
+ CSset *freqCSset; /* Set of frequent CSs */
+ oid *subjCSMap = NULL; /* Store the corresponding CS
Id for each subject */
+ oid *csFreqCSMap;
+ int i;
+ oid maxCSoid = 0;
+ BAT *sbat = NULL;
+ BATiter si;
+ BUN p,q;
+ BAT *sNewBat;
+ BUN newId;
+ oid *sbt;
+
+ freqCSset = initCSset();
+
+ if (RDFextractCSwithTypes(ret, sbatid, pbatid, obatid, mapbatid,
freqThreshold, freqCSset,&subjCSMap, &maxCSoid) != MAL_SUCCEED){
+ throw(RDF, "rdf.RDFreorganize", "Problem in extracting CSs");
+ }
+
+ printf("Start re-organizing triple store \n");
+ csFreqCSMap = (oid *) malloc (sizeof (oid) * maxCSoid);
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list