Hello,

I have a problem with repository (OWLIM SE 5.1.5208) with property enablePredicateList set to true. Documentation says that such configuration should speed up queries that use wildcard predicate patterns but our tests show the opposite. Please, see the attached test class - it creates a repository with little data and executes very simple query:

PREFIX foaf:<http://xmlns.com/foaf/0.1/>
select * WHERE {
     <resource:1> foaf:knows ?person2 .
     ?person2 ?pred ?obj
}

Here are the results (with predicate list enabled and disabled):

Execute queries with predicate list enabled
Executing query q1
Result count: 2 in 2,555 s.
Execute queries with predicate list disabled
Executing query q1
Result count: 2 in 0,000 s.

--
Best regards,
Krzysztof Sielski
Poznan Supercomputing and Networking Center

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.openrdf.model.Graph;
import org.openrdf.model.Resource;
import org.openrdf.model.URI;
import org.openrdf.model.impl.GraphImpl;
import org.openrdf.model.impl.LiteralImpl;
import org.openrdf.model.impl.StatementImpl;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.model.impl.ValueFactoryImpl;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.config.RepositoryConfig;
import org.openrdf.repository.config.RepositoryConfigException;
import org.openrdf.repository.config.RepositoryConfigSchema;
import org.openrdf.repository.manager.LocalRepositoryManager;
import org.openrdf.repository.manager.RepositoryManager;
import org.openrdf.repository.sail.config.SailRepositorySchema;
import org.openrdf.sail.config.SailConfigSchema;

/**
 *
 * @author Krzysztof Sielski
 */
public class OwlimTestCaseWildcardPredicate {

        private static final String REPO_ID = "repo";
        private static URI foaf_knows = new 
URIImpl("http://xmlns.com/foaf/0.1/knows";);
        private static URI foaf_name = new 
URIImpl("http://xmlns.com/foaf/0.1/name";);
        private static final String q1 = ""
                        + "PREFIX foaf:<http://xmlns.com/foaf/0.1/>"
                        + "select * WHERE {"
                        + "     <resource:1> foaf:knows ?person2 ."
                        + "     ?person2 ?pred ?obj"
                        + "} ";

        public static void main(String[] args)
                        throws Exception {
                RepositoryManager manager = new LocalRepositoryManager(new 
File("."));
                manager.initialize();
                try {
                        initRepository(manager, true);
                        insertInitialData(manager);
                        System.out.println("Execute queries with predicate list 
enabled");
                        executeQueries(manager);
                        initRepository(manager, false);
                        System.out.println("Execute queries with predicate list 
disabled");
                        executeQueries(manager);
                } finally {
                        manager.shutDown();
                }
        }

        private static void executeQueries(RepositoryManager manager)
                        throws Exception {
                Repository repo = manager.getRepository(REPO_ID);
                repo.initialize();
                RepositoryConnection con = repo.getConnection();
                con.setAutoCommit(false);

                System.out.println("Executing query q1");
                executeQuery(q1, con);

                con.close();
                repo.shutDown();
        }

        private static void executeQuery(String query, RepositoryConnection 
con) {
                try {
                        TupleQueryResult result = 
con.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate();
                        int resultCount = 0;
                        long time = System.currentTimeMillis();
                        while (result.hasNext()) {
                                result.next();
                                resultCount++;
                        }
                        time = System.currentTimeMillis() - time;
                        System.out.printf("Result count: %d in %.3f s.\n", 
resultCount, time / 1000.0);
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        private static void insertInitialData(RepositoryManager manager)
                        throws Exception {
                Repository repo = manager.getRepository(REPO_ID);
                RepositoryConnection con = repo.getConnection();
                con.setAutoCommit(false);

                // add objects
                final int peopleCount = 500000;
                for (int i = 0; i < peopleCount; i++) {
                        URI person = new URIImpl("resource:" + i);
                        con.add(person, foaf_knows, new URIImpl("resource:" + 
(i + 1)));
                        con.add(person, foaf_name, new LiteralImpl("name_" + 
i));

                        if (i % 1000 == 0) {
                                con.commit();
                        }
                }

                con.commit();
                con.close();
        }

        private static void initRepository(RepositoryManager manager, boolean 
enablePredicateList)
                        throws Exception {
                // create repository
                HashMap<URI, String> properties = new HashMap<URI, String>();
                properties.put(new 
URIImpl("http://www.ontotext.com/trree/owlim#ruleset";), "empty");
                properties.put(new 
URIImpl("http://www.ontotext.com/trree/owlim#transaction-mode";), "fast");
                properties.put(new 
URIImpl("http://www.ontotext.com/trree/owlim#transaction-isolation";), "false");
                properties.put(new 
URIImpl("http://www.ontotext.com/trree/owlim#enable-literal-index";), "false");
                properties.put(new 
URIImpl("http://www.ontotext.com/trree/owlim#enablePredicateList";), 
Boolean.toString(enablePredicateList));
                RepositoryConfig conf = createRepositoryConfig(REPO_ID, 
"descr", properties);
                manager.addRepositoryConfig(conf);
        }

        private static RepositoryConfig createRepositoryConfig(String id, 
String description, Map<URI, String> properties)
                        throws RepositoryConfigException {
                Graph configGraph = new GraphImpl();
                Resource repositoryNode = 
ValueFactoryImpl.getInstance().createBNode();
                Resource repositoryImplNode = 
ValueFactoryImpl.getInstance().createBNode();
                Resource sailImplNode = 
ValueFactoryImpl.getInstance().createBNode();

                configGraph.add(new StatementImpl(repositoryNode, RDF.TYPE, 
RepositoryConfigSchema.REPOSITORY));
                configGraph.add(new StatementImpl(repositoryNode, 
RepositoryConfigSchema.REPOSITORYID, new LiteralImpl(id)));
                configGraph.add(new StatementImpl(repositoryNode, RDFS.LABEL, 
new LiteralImpl(description)));

                configGraph.add(new StatementImpl(repositoryNode, 
RepositoryConfigSchema.REPOSITORYIMPL, repositoryImplNode));
                configGraph.add(new StatementImpl(repositoryImplNode, 
RepositoryConfigSchema.REPOSITORYTYPE,
                                new LiteralImpl("openrdf:SailRepository")));
                configGraph.add(new StatementImpl(repositoryImplNode, 
SailRepositorySchema.SAILIMPL, sailImplNode));
                configGraph.add(new StatementImpl(sailImplNode, 
SailConfigSchema.SAILTYPE, new LiteralImpl("owlim:Sail")));

                for (Map.Entry<URI, String> configEntry : 
properties.entrySet()) {
                        configGraph.add(new StatementImpl(sailImplNode, 
configEntry.getKey(), new LiteralImpl(configEntry.getValue())));
                }

                RepositoryConfig config = RepositoryConfig.create(configGraph, 
repositoryNode);
                return config;
        }
}
_______________________________________________
Owlim-discussion mailing list
[email protected]
http://ontomail.semdata.org/cgi-bin/mailman/listinfo/owlim-discussion

Reply via email to