| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.rya.indexing.mongo; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.math.BigInteger; |
| import java.util.HashSet; |
| import java.util.Optional; |
| import java.util.Set; |
| |
| import org.apache.rya.api.domain.RyaIRI; |
| import org.apache.rya.indexing.accumulo.ConfigUtils; |
| import org.apache.rya.indexing.entity.model.Entity; |
| import org.apache.rya.indexing.entity.model.Type; |
| import org.apache.rya.indexing.entity.storage.EntityStorage; |
| import org.apache.rya.indexing.entity.storage.TypeStorage; |
| import org.apache.rya.indexing.entity.update.mongo.MongoEntityIndexer; |
| import org.apache.rya.mongodb.MongoDBRdfConfiguration; |
| import org.apache.rya.mongodb.MongoITBase; |
| import org.apache.rya.sail.config.RyaSailFactory; |
| import org.eclipse.rdf4j.model.IRI; |
| import org.eclipse.rdf4j.model.Value; |
| import org.eclipse.rdf4j.model.ValueFactory; |
| import org.eclipse.rdf4j.model.impl.SimpleValueFactory; |
| import org.eclipse.rdf4j.model.vocabulary.RDF; |
| import org.eclipse.rdf4j.query.BindingSet; |
| import org.eclipse.rdf4j.query.QueryLanguage; |
| import org.eclipse.rdf4j.query.TupleQueryResult; |
| import org.eclipse.rdf4j.query.impl.MapBindingSet; |
| import org.eclipse.rdf4j.repository.sail.SailRepository; |
| import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; |
| import org.eclipse.rdf4j.sail.Sail; |
| import org.junit.Test; |
| |
| import com.google.common.collect.ImmutableSet; |
| |
| public class MongoEntityIndexIT extends MongoITBase { |
| private static final ValueFactory VF = SimpleValueFactory.getInstance(); |
| |
| @Override |
| protected void updateConfiguration(final MongoDBRdfConfiguration conf) { |
| conf.setBoolean(ConfigUtils.USE_MONGO, true); |
| conf.setBoolean(ConfigUtils.USE_ENTITY, true); |
| } |
| |
| @Test |
| public void ensureInEntityStore_Test() throws Exception { |
| final Sail sail = RyaSailFactory.getInstance(conf); |
| SailRepositoryConnection conn = new SailRepository(sail).getConnection(); |
| conn.begin(); |
| |
| try(MongoEntityIndexer indexer = new MongoEntityIndexer()) { |
| indexer.setConf(conf); |
| indexer.init(); |
| |
| setupTypes(indexer); |
| addStatements(conn); |
| |
| final EntityStorage entities = indexer.getEntityStorage(); |
| final RyaIRI subject = new RyaIRI("urn:alice"); |
| final Optional<Entity> alice = entities.get(subject); |
| assertTrue(alice.isPresent()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void sparqlQuery_Test() throws Exception { |
| final Sail sail = RyaSailFactory.getInstance(conf); |
| SailRepositoryConnection conn = new SailRepository(sail).getConnection(); |
| conn.begin(); |
| |
| try(MongoEntityIndexer indexer = new MongoEntityIndexer()) { |
| indexer.setConf(conf); |
| indexer.init(); |
| |
| setupTypes(indexer); |
| addStatements(conn); |
| |
| final String query = "SELECT * WHERE { " + |
| "<urn:strawberry> <" + RDF.TYPE + "> <urn:icecream> ."+ |
| "<urn:strawberry> <urn:brand> ?brand . " + |
| "<urn:strawberry> <urn:flavor> ?flavor . " + |
| "}"; |
| |
| final TupleQueryResult rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); |
| final Set<BindingSet> results = new HashSet<>(); |
| while(rez.hasNext()) { |
| final BindingSet bs = rez.next(); |
| results.add(bs); |
| } |
| final MapBindingSet expected = new MapBindingSet(); |
| expected.addBinding("flavor", VF.createLiteral("Strawberry")); |
| expected.addBinding("brand", VF.createLiteral("Awesome Icecream")); |
| |
| assertEquals(1, results.size()); |
| assertEquals(expected, results.iterator().next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void partialQuery_Test() throws Exception { |
| final Sail sail = RyaSailFactory.getInstance(conf); |
| SailRepositoryConnection conn = new SailRepository(sail).getConnection(); |
| conn.begin(); |
| |
| try(MongoEntityIndexer indexer = new MongoEntityIndexer()) { |
| indexer.setConf(conf); |
| indexer.init(); |
| |
| setupTypes(indexer); |
| addStatements(conn); |
| conn.commit(); |
| |
| final String query = "SELECT * WHERE { " + |
| "<urn:george> <" + RDF.TYPE + "> <urn:person> ."+ |
| "<urn:george> <urn:name> ?name . " + |
| "<urn:george> <urn:eye> ?eye . " + |
| "}"; |
| |
| final TupleQueryResult rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); |
| final Set<BindingSet> results = new HashSet<>(); |
| while(rez.hasNext()) { |
| final BindingSet bs = rez.next(); |
| System.out.println(bs); |
| results.add(bs); |
| } |
| final MapBindingSet expected = new MapBindingSet(); |
| //expected.addBinding("name", VF.createIRI("http://www.w3.org/2001/SMLSchema#string", "George")); |
| expected.addBinding("name", VF.createLiteral("George")); |
| expected.addBinding("eye", VF.createLiteral("blue")); |
| |
| assertEquals(1, results.size()); |
| assertEquals(expected, results.iterator().next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| private void setupTypes(MongoEntityIndexer indexer) throws Exception { |
| final TypeStorage typeStore = indexer.getTypeStorage(); |
| // Add some Types to the storage. |
| final Type cat = new Type(new RyaIRI("urn:cat"), |
| ImmutableSet.<RyaIRI>builder() |
| .add(new RyaIRI("urn:numLegs")) |
| .add(new RyaIRI("urn:eye")) |
| .add(new RyaIRI("urn:species")) |
| .build()); |
| |
| final Type dog = new Type(new RyaIRI("urn:dog"), |
| ImmutableSet.<RyaIRI>builder() |
| .add(new RyaIRI("urn:numLegs")) |
| .add(new RyaIRI("urn:eye")) |
| .add(new RyaIRI("urn:species")) |
| .build()); |
| |
| final Type icecream = new Type(new RyaIRI("urn:icecream"), |
| ImmutableSet.<RyaIRI>builder() |
| .add(new RyaIRI("urn:brand")) |
| .add(new RyaIRI("urn:flavor")) |
| .add(new RyaIRI("urn:cost")) |
| .build()); |
| |
| final Type person = new Type(new RyaIRI("urn:person"), |
| ImmutableSet.<RyaIRI>builder() |
| .add(new RyaIRI("urn:name")) |
| .add(new RyaIRI("urn:age")) |
| .add(new RyaIRI("urn:eye")) |
| .build()); |
| |
| typeStore.create(cat); |
| typeStore.create(dog); |
| typeStore.create(icecream); |
| typeStore.create(person); |
| } |
| |
| private void addStatements(SailRepositoryConnection conn) throws Exception { |
| //alice |
| IRI subject = VF.createIRI("urn:alice"); |
| IRI predicate = VF.createIRI("urn:name"); |
| Value object = VF.createLiteral("Alice"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:eye"); |
| object = VF.createLiteral("blue"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:age"); |
| object = VF.createLiteral(BigInteger.valueOf(30)); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person"))); |
| |
| //bob |
| subject = VF.createIRI("urn:bob"); |
| predicate = VF.createIRI("urn:name"); |
| object = VF.createLiteral("Bob"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:eye"); |
| object = VF.createLiteral("brown"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:age"); |
| object = VF.createLiteral(BigInteger.valueOf(57)); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person"))); |
| |
| //charlie |
| subject = VF.createIRI("urn:charlie"); |
| predicate = VF.createIRI("urn:name"); |
| object = VF.createLiteral("Charlie"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:eye"); |
| object = VF.createLiteral("hazel"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:age"); |
| object = VF.createLiteral(BigInteger.valueOf(25)); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person"))); |
| |
| //david |
| subject = VF.createIRI("urn:david"); |
| predicate = VF.createIRI("urn:name"); |
| object = VF.createLiteral("David"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:eye"); |
| object = VF.createLiteral("brown"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:age"); |
| object = VF.createLiteral(BigInteger.valueOf(30)); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person"))); |
| |
| //eve |
| subject = VF.createIRI("urn:eve"); |
| predicate = VF.createIRI("urn:name"); |
| object = VF.createLiteral("Bob"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:age"); |
| object = VF.createLiteral(BigInteger.valueOf(25)); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person"))); |
| |
| //frank |
| subject = VF.createIRI("urn:frank"); |
| predicate = VF.createIRI("urn:name"); |
| object = VF.createLiteral("Frank"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:eye"); |
| object = VF.createLiteral("Hazel"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:age"); |
| object = VF.createLiteral(BigInteger.valueOf(57)); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person"))); |
| |
| //george |
| subject = VF.createIRI("urn:george"); |
| predicate = VF.createIRI("urn:name"); |
| object = VF.createLiteral("George"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:eye"); |
| object = VF.createLiteral("blue"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:age"); |
| object = VF.createLiteral(BigInteger.valueOf(30)); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person"))); |
| |
| // Some Icecream typed objects. |
| //chocolate |
| subject = VF.createIRI("urn:chocolate"); |
| predicate = VF.createIRI("urn:brand"); |
| object = VF.createLiteral("Awesome Icecream"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:flavor"); |
| object = VF.createLiteral("Chocolate"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:icecream"))); |
| |
| //vanilla |
| subject = VF.createIRI("urn:vanilla"); |
| predicate = VF.createIRI("urn:brand"); |
| object = VF.createLiteral("Awesome Icecream"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:flavor"); |
| object = VF.createLiteral("Vanilla"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:icecream"))); |
| |
| //strawberry |
| subject = VF.createIRI("urn:strawberry"); |
| predicate = VF.createIRI("urn:brand"); |
| object = VF.createLiteral("Awesome Icecream"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| predicate = VF.createIRI("urn:flavor"); |
| object = VF.createLiteral("Strawberry"); |
| conn.add(VF.createStatement(subject, predicate, object)); |
| conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:icecream"))); |
| |
| conn.commit(); |
| } |
| } |