All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bigdata.rdf.spo.TestSPOStarJoin Maven / Gradle / Ivy

There is a newer version: 2.1.4
Show newest version
package com.bigdata.rdf.spo;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Properties;

import org.openrdf.model.ValueFactory;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.query.QueryEvaluationException;

import com.bigdata.bop.BOp;
import com.bigdata.bop.Constant;
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IPredicate;
import com.bigdata.bop.NV;
import com.bigdata.bop.Var;
import com.bigdata.bop.bindingSet.ListBindingSet;
import com.bigdata.bop.joinGraph.IEvaluationPlanFactory;
import com.bigdata.bop.joinGraph.fast.DefaultEvaluationPlanFactory2;
import com.bigdata.rdf.axioms.NoAxioms;
import com.bigdata.rdf.internal.IV;
import com.bigdata.rdf.model.BigdataURIImpl;
import com.bigdata.rdf.rules.RuleContextEnum;
import com.bigdata.rdf.store.AbstractTripleStore;
import com.bigdata.rdf.store.AbstractTripleStoreTestCase;
import com.bigdata.rdf.vocab.NoVocabulary;
import com.bigdata.relation.rule.Rule;
import com.bigdata.relation.rule.eval.ActionEnum;
import com.bigdata.relation.rule.eval.IJoinNexus;
import com.bigdata.relation.rule.eval.IJoinNexusFactory;
import com.bigdata.relation.rule.eval.ISolution;
import com.bigdata.striterator.IChunkedOrderedIterator;

public class TestSPOStarJoin extends AbstractTripleStoreTestCase {

    /**
     * 
     */
    public TestSPOStarJoin() {
    }

    /**
     * @param name
     */
    public TestSPOStarJoin(String name) {
        
        super(name);
        
    }

    @Override
    public Properties getProperties() {
        
        Properties props = super.getProperties();
        
        props.setProperty(AbstractTripleStore.Options.STATEMENT_IDENTIFIERS, 
                "false");
        
        props.setProperty(AbstractTripleStore.Options.AXIOMS_CLASS, 
                NoAxioms.class.getName());
        
        props.setProperty(AbstractTripleStore.Options.VOCABULARY_CLASS, 
                NoVocabulary.class.getName());
        
        return props;
        
    }
    
    private void _testStarJoin1() throws Exception {
        
        final AbstractTripleStore store = getStore(getProperties());
        
        try {
/*            
            ?frameClass a   FrameClass
            ?frameClass frame:ontologyClass ?class
            ?frameClass frame:frameProperty ?frameProperty

            SPOPredicate(?frameClass,_,_)       
                star    frame:ontologyClass ?class
                        frame:frameProperty ?frameProperty
            
            fc1 frame:ontologyClass class1
            fc1 frame:frameProperty fp1
            fc2 frame:ontologyClass class1
            fc2 frame:frameProperty fp1
            fc2 frame:frameProperty fp2
            
            solutions               
            {fc1,class1,fp1}        
            {fc2,class1,fp1}        
            {fc2,class1,fp2}        
*/            
            final String ns = "http://www.bigdata.com/rdf#";
            
            final ValueFactory vf = store.getValueFactory();
            
            final BigdataURIImpl fc1 = (BigdataURIImpl) vf.createURI(ns+"fc1");
            final BigdataURIImpl fc2 = (BigdataURIImpl) vf.createURI(ns+"fc2");
            final BigdataURIImpl fp1 = (BigdataURIImpl) vf.createURI(ns+"fp1");
            final BigdataURIImpl fp2 = (BigdataURIImpl) vf.createURI(ns+"fp2");
            final BigdataURIImpl class1 = (BigdataURIImpl) vf.createURI(ns+"class1");
            final BigdataURIImpl ontologyClass = (BigdataURIImpl) vf.createURI(ns+"ontologyClass");
            final BigdataURIImpl frameProperty = (BigdataURIImpl) vf.createURI(ns+"frameProperty");
            final BigdataURIImpl frameClass = (BigdataURIImpl) vf.createURI(ns+"FrameClass");
            
            store.addStatement(fc1, RDF.TYPE, frameClass);
            store.addStatement(fc2, RDF.TYPE, frameClass);
            store.addStatement(fc1, ontologyClass, class1);
            store.addStatement(fc1, frameProperty, fp1);
            store.addStatement(fc2, ontologyClass, class1);
            store.addStatement(fc2, frameProperty, fp1);
            store.addStatement(fc2, frameProperty, fp2);
            
            store.commit();
            
            System.err.println(store.dumpStore());

			final SPOPredicate pred = new SPOPredicate(new BOp[] {
					Var.var("frameClass"),
					new Constant(store.getIV(RDF.TYPE)),
					new Constant(frameClass.getIV()) }, new NV(
					IPredicate.Annotations.RELATION_NAME, new String[] { store
							.getSPORelation().getNamespace(), }));

            final SPOStarJoin starJoin = new SPOStarJoin(new BOp[] {
                    Var.var("frameClass"), Var.var(), Var.var()},//, null /* c */},
                    NV.asMap(new NV[] { new NV(
                            SPOStarJoin.Annotations.RELATION_NAME, new String[]{store
                                    .getSPORelation().getNamespace()}) }));
//            final SPOStarJoin starJoin = new SPOStarJoin(
//                    store.getSPORelation().getNamespace(),
//                    Var.var("frameClass")
//                    );
            
            starJoin.addStarConstraint(new SPOStarJoin.SPOStarConstraint(
                    new Constant(ontologyClass.getIV()),
                    Var.var("class")));
            
            starJoin.addStarConstraint(new SPOStarJoin.SPOStarConstraint(
                    new Constant(frameProperty.getIV()),
                    Var.var("frameProperty")));
            
            final Rule rule = new Rule(
                    "testStarJoin",
                    null, // head
                    new IPredicate[] { pred, starJoin }, 
                    null // constraints
                    );
            
            final IEvaluationPlanFactory planFactory = 
                DefaultEvaluationPlanFactory2.INSTANCE;

            final IJoinNexusFactory joinNexusFactory = store
                    .newJoinNexusFactory(RuleContextEnum.HighLevelQuery,
                            ActionEnum.Query, IJoinNexus.BINDINGS, 
                            null, // filter
                            false, // justify
                            false, // backchain
                            planFactory//
                    );

            final IJoinNexus joinNexus = joinNexusFactory.newInstance(store
                    .getIndexManager());

            final IChunkedOrderedIterator itr1 = 
                joinNexus.runQuery(rule);
            /*
            while (itr1.hasNext()) {
                
                ISolution solution = itr1.next();
                
                IBindingSet bs = solution.getBindingSet();
                
                System.err.println(bs);
                
            }
            */
            Collection answer = new LinkedList();
            answer.add(createBindingSet(
                    new Binding(Var.var("frameClass"), new Constant(fc1.getIV())),
                    new Binding(Var.var("class"), new Constant(class1.getIV())),
                    new Binding(Var.var("frameProperty"), new Constant(fp1.getIV()))
                    ));
            answer.add(createBindingSet(
                    new Binding(Var.var("frameClass"), new Constant(fc2.getIV())),
                    new Binding(Var.var("class"), new Constant(class1.getIV())),
                    new Binding(Var.var("frameProperty"), new Constant(fp1.getIV()))
                    ));
            answer.add(createBindingSet(
                    new Binding(Var.var("frameClass"), new Constant(fc2.getIV())),
                    new Binding(Var.var("class"), new Constant(class1.getIV())),
                    new Binding(Var.var("frameProperty"), new Constant(fp2.getIV()))
                    ));
            
            compare(itr1, answer);
            
            
        } finally {
            
            store.__tearDownUnitTest();
            
        }
        
    }

    private void _testStarJoin2() throws Exception {
        
        final AbstractTripleStore store = getStore(getProperties());
        
        try {
/*            
            ?frameProp frame:ontologyProperty ?value .      
            ?frameProp frame:multiValued ?multiValued1 .        
            OPTIONAL { ?frameProp frame:propertyRange ?range1 . } .     
            
            SPOPredicate(?frameProp,_,_)       
            star    frame:ontologyProperty ?value   
                    frame:multiValued ?multiValued1 
                    OPTIONAL frame:propertyRange ?range1    
            
            fp1 frame:ontologyProperty  v1
            fp1 frame:multiValued   mv1
            fp1 frame:multiValued   mv2
            
            fp2 frame:ontologyProperty  v2
            fp2 frame:multiValued   mv1
            fp2 frame:multiValued   mv2
            fp2 frame:propertyRange r1
            fp2 frame:propertyRange r2
            
            solutions               
            {fp1,v1,mv1}
            {fp1,v1,mv2}
            {fp2,v2,mv1,r1}
            {fp2,v2,mv1,r2}
            {fp2,v2,mv2,r1}
            {fp2,v2,mv2,r2}
*/            
            final String ns = "http://www.bigdata.com/rdf#";
            
            final ValueFactory vf = store.getValueFactory();
            
            final BigdataURIImpl fp1 = (BigdataURIImpl) vf.createURI(ns+"fp1");
            final BigdataURIImpl fp2 = (BigdataURIImpl) vf.createURI(ns+"fp2");
            final BigdataURIImpl ontologyProperty = (BigdataURIImpl) vf.createURI(ns+"ontologyProperty");
            final BigdataURIImpl multiValued = (BigdataURIImpl) vf.createURI(ns+"multiValued");
            final BigdataURIImpl propertyRange = (BigdataURIImpl) vf.createURI(ns+"propertyRange");
            final BigdataURIImpl v1 = (BigdataURIImpl) vf.createURI(ns+"v1");
            final BigdataURIImpl v2 = (BigdataURIImpl) vf.createURI(ns+"v2");
            final BigdataURIImpl mv1 = (BigdataURIImpl) vf.createURI(ns+"mv1");
            final BigdataURIImpl mv2 = (BigdataURIImpl) vf.createURI(ns+"mv2");
            final BigdataURIImpl r1 = (BigdataURIImpl) vf.createURI(ns+"r1");
            final BigdataURIImpl r2 = (BigdataURIImpl) vf.createURI(ns+"r2");
            
            store.addStatement(fp1, RDF.TYPE, RDFS.RESOURCE);
            store.addStatement(fp1, ontologyProperty, v1);
            store.addStatement(fp1, multiValued, mv1);
            store.addStatement(fp1, multiValued, mv2);
            store.addStatement(fp2, RDF.TYPE, RDFS.RESOURCE);
            store.addStatement(fp2, ontologyProperty, v2);
            store.addStatement(fp2, multiValued, mv1);
            store.addStatement(fp2, multiValued, mv2);
            store.addStatement(fp2, propertyRange, r1);
            store.addStatement(fp2, propertyRange, r2);
            
            store.commit();
            
            System.err.println(store.dumpStore());
            
            final SPOPredicate pred = new SPOPredicate(
            		new BOp[]{Var.var("frameProperty"),
                    new Constant(store.getIV(RDF.TYPE)),
                    new Constant(store.getIV(RDFS.RESOURCE))},
                    new NV(IPredicate.Annotations.RELATION_NAME,new String[]{store.getSPORelation().getNamespace()})
                    );

            final SPOStarJoin starJoin = new SPOStarJoin(new BOp[] {
                    Var.var("frameProperty"), Var.var(), Var.var()},//, null /* c */},
                    NV.asMap(new NV[] { new NV(
                            SPOStarJoin.Annotations.RELATION_NAME, new String[]{store
                                    .getSPORelation().getNamespace()}) }));

//            final SPOStarJoin starJoin = new SPOStarJoin(
//                    store.getSPORelation().getNamespace(),
//                    Var.var("frameProperty")
//                    );
            
            starJoin.addStarConstraint(new SPOStarJoin.SPOStarConstraint(
                    new Constant(ontologyProperty.getIV()),
                    Var.var("value")));
            
            starJoin.addStarConstraint(new SPOStarJoin.SPOStarConstraint(
                    new Constant(multiValued.getIV()),
                    Var.var("multiValued1")));
            
            starJoin.addStarConstraint(new SPOStarJoin.SPOStarConstraint(
                    new Constant(propertyRange.getIV()),
                    Var.var("range1"),
                    true));
            
            final Rule rule = new Rule(
                    "testStarJoin",
                    null, // head
                    new IPredicate[] { pred, starJoin }, 
                    null // constraints
                    );
            
            final IEvaluationPlanFactory planFactory = 
                DefaultEvaluationPlanFactory2.INSTANCE;

            final IJoinNexusFactory joinNexusFactory = store
                    .newJoinNexusFactory(RuleContextEnum.HighLevelQuery,
                            ActionEnum.Query, IJoinNexus.BINDINGS, 
                            null, // filter
                            false, // justify
                            false, // backchain
                            planFactory//
                    );

            final IJoinNexus joinNexus = joinNexusFactory.newInstance(store
                    .getIndexManager());

            final IChunkedOrderedIterator itr1 = 
                joinNexus.runQuery(rule);
            /*
            while (itr1.hasNext()) {
                
                ISolution solution = itr1.next();
                
                IBindingSet bs = solution.getBindingSet();
                
                System.err.println(bs);
                
            }
            */
            Collection answer = new LinkedList();
            answer.add(createBindingSet(
                    new Binding(Var.var("frameProperty"), new Constant(fp1.getIV())),
                    new Binding(Var.var("value"), new Constant(v1.getIV())),
                    new Binding(Var.var("multiValued1"), new Constant(mv1.getIV()))
                    ));
            answer.add(createBindingSet(
                    new Binding(Var.var("frameProperty"), new Constant(fp1.getIV())),
                    new Binding(Var.var("value"), new Constant(v1.getIV())),
                    new Binding(Var.var("multiValued1"), new Constant(mv2.getIV()))
                    ));
            answer.add(createBindingSet(
                    new Binding(Var.var("frameProperty"), new Constant(fp2.getIV())),
                    new Binding(Var.var("value"), new Constant(v2.getIV())),
                    new Binding(Var.var("multiValued1"), new Constant(mv1.getIV())),
                    new Binding(Var.var("range1"), new Constant(r1.getIV()))
                    ));
            answer.add(createBindingSet(
                    new Binding(Var.var("frameProperty"), new Constant(fp2.getIV())),
                    new Binding(Var.var("value"), new Constant(v2.getIV())),
                    new Binding(Var.var("multiValued1"), new Constant(mv2.getIV())),
                    new Binding(Var.var("range1"), new Constant(r1.getIV()))
                    ));
            answer.add(createBindingSet(
                    new Binding(Var.var("frameProperty"), new Constant(fp2.getIV())),
                    new Binding(Var.var("value"), new Constant(v2.getIV())),
                    new Binding(Var.var("multiValued1"), new Constant(mv1.getIV())),
                    new Binding(Var.var("range1"), new Constant(r2.getIV()))
                    ));
            answer.add(createBindingSet(
                    new Binding(Var.var("frameProperty"), new Constant(fp2.getIV())),
                    new Binding(Var.var("value"), new Constant(v2.getIV())),
                    new Binding(Var.var("multiValued1"), new Constant(mv2.getIV())),
                    new Binding(Var.var("range1"), new Constant(r2.getIV()))
                    ));
            
            compare(itr1, answer);
            
        } finally {
            
            store.__tearDownUnitTest();
            
        }
        
    }

    protected IBindingSet createBindingSet(final IBinding... bindings) {
        final IBindingSet bindingSet = new ListBindingSet();
        if (bindings != null) {
            for (IBinding b : bindings) {
                bindingSet.set(b.getVar(), b.getVal());
            }
        }
        return bindingSet;
    }
    
    protected void compare(final IChunkedOrderedIterator result,
            final Collection answer)
            throws QueryEvaluationException {

        try {
            
            final Collection extraResults = new LinkedList();
            Collection missingResults = new LinkedList();
    
            int resultCount = 0;
            int nmatched = 0;
            while (result.hasNext()) {
                ISolution solution = result.next();
                IBindingSet bindingSet = solution.getBindingSet();
                resultCount++;
                boolean match = false;
                if(log.isInfoEnabled())
                    log.info(bindingSet);
                Iterator it = answer.iterator();
                while (it.hasNext()) {
                    if (it.next().equals(bindingSet)) {
                        it.remove();
                        match = true;
                        nmatched++;
                        break;
                    }
                }
                if (match == false) {
                    extraResults.add(bindingSet);
                }
            }
            missingResults = answer;
    
            for (IBindingSet bs : extraResults) {
                if (log.isInfoEnabled()) {
                    log.info("extra result: " + bs);
                }
            }
            
            for (IBindingSet bs : missingResults) {
                if (log.isInfoEnabled()) {
                    log.info("missing result: " + bs);
                }
            }
            
            if (!extraResults.isEmpty() || !missingResults.isEmpty()) {
                fail("matchedResults=" + nmatched + ", extraResults="
                        + extraResults.size() + ", missingResults="
                        + missingResults.size());
            }

        } finally {
            
            result.close();
            
        }
        
    }
    
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy